Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

Округление   Найти похожие ветки 

 
zorik   (2004-10-13 09:59) [0]

Здраствуте мастера!
Вопрос в следующем. Имеется масив чисел с плавающей точкой и сума этих чисел - целое число. Нужно округлить значения чисел до целых, так чтоб сума равнялась прежней.
Например:

до округления:   1.6+5.6+2.8=10
псле округления  2  +6  +3  =11

10 не равно 11 :-(

Может есть какие-то идеи?


 
Sandman25 ©   (2004-10-13 10:05) [1]

Последний элемент находить как разность.


 
Kolan ©   (2004-10-13 10:08) [2]

Можно самому делать например: Округлил все в большую
2  +6  +3  =11 11<>10
след шаг первое округлил в меньшее остальные вверх
1+6+3=10 10=10 OK
Ну итд но тут комбинаций верных может быть много сам понимаешь как нужную выбрать ?
PS 2+5+3=10


 
zorik   (2004-10-13 10:16) [3]

Это будет неправильно! Элементов около 300 ы последний может нулю быть равным. Чтоб было все ясно объясню. элементы масива - это значения измерений приборов за единицу времени [q[i]] (например сутки), а сума - это общий показатель по всем приборам [q_fact] (например за месяц). Сначала находится коэфициент пересчета как

  k=q_fakt/sum(q[i])

Потом каждый элемент умножается на этот коэфициент и округляется до целого.


 
ЮЮ ©   (2004-10-13 10:20) [4]

>Элементов около 300
>и округляется до целого

значит как минимум 200 элементов должны быть равны 0, даже если что-то показывали? И как тогда их отличмть от тех, что действительно были нулевыми?


 
Kolan ©   (2004-10-13 10:25) [5]

Ну не понл
> Потом каждый элемент умножается на этот коэфициент и округляется
> до целого
ну и пусть округляется...
Зачем тогда чтоб суммы совпадали
да и чем мой вариант не подходит
Можно еше ввести проверку и допустим  элементы > *.7 не округлять в меньшую. А < *.4 в больщую


 
Verg ©   (2004-10-13 10:36) [6]

a  - массив вещ. чисел
ia - массив округленных целых
S = round(sum(a));
iS = sum(ia);

S-iS может принимать значения -1, 0, 1
if S < iS
{
 // это значит, что хотя бы один элемент a был округлен в большую сторону
 находим серди a[i] с максимальным frac(a[i]) > 0.5
 уменшаем соотв. элемент ia на единицу ia[i]--;
}
else
{
 // это значит, что хотя бы один элемент a был округлен в меньшую сторону
 находим серди a[i] с минимальным frac(a[i]) <= 0.5
 увеличиваем соотв. элемент ia на единицу ia[i]++;
}


 
Verg ©   (2004-10-13 10:37) [7]

a  - массив вещ. чисел
ia - массив округленных целых
S = round(sum(a));
iS = sum(ia);

S-iS может принимать значения -1, 0, 1
if S < iS
{
 // это значит, что хотя бы один элемент a был округлен в большую сторону
 находим серди a[i] с минимальным frac(a[i]) > 0.5
 уменшаем соотв. элемент ia на единицу ia[i]--;
}
else
{
 // это значит, что хотя бы один элемент a был округлен в меньшую сторону
 находим серди a[i] с максимальным frac(a[i]) <= 0.5
 увеличиваем соотв. элемент ia на единицу ia[i]++;
}


 
zorik   (2004-10-13 10:46) [8]

to kolan>
Если много елементов - последний должен отвечать за все, а если он найменший. Можно правда максимальный найти и к нему добавлять (отнимать). А можно чило, равное разнице сум, максимальных елементов и к ним подобавлять (поотнимать) по единичке


 
zorik   (2004-10-13 10:55) [9]

>S-iS может принимать значения -1, 0, 1

s-is может принимать и -2 и -3 и +2 и +3 и ... :-)


 
ЮЮ ©   (2004-10-13 11:01) [10]

r[] - массив "весов"  q[i]/sum(q[i])

//sum = sum(q[i])
sumR := 0;
sumRound := 0;
for i := 0 to ... do begin
qRound[i] := Round((sumR + r[i]) * sum) - sumRound;
Inc(sumRound, qRound[i]);
sumR := sumR + r[i];  
end;

это, по моему, позволит не накапливаться ошибке



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.038 c
14-1096638318
malkolinge
2004-10-01 17:45
2004.10.31
Delphi programmer needed


14-1097499849
quickblack
2004-10-11 17:04
2004.10.31
Порты для интернета


10-1054713801
OlegL
2003-06-04 12:03
2004.10.31
Методы COM object-а


1-1098168338
Kat
2004-10-19 10:45
2004.10.31
Есть число типа smallint.


4-1095756933
HDD
2004-09-21 12:55
2004.10.31
Индификатор окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский