Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
14-1097172164
Abzz
2004-10-07 22:02
2004.10.31
Сколько стоит?


1-1097693549
volser
2004-10-13 22:52
2004.10.31
Левый и правый alt, ctrl, shift


14-1097077567
Leksiy
2004-10-06 19:46
2004.10.31
Глюк


4-1096040015
appendix
2004-09-24 19:33
2004.10.31
поток в Win98 и winXP


14-1097551845
pkm
2004-10-12 07:30
2004.10.31
Виртуальный диск.