Форум: "Основная";
Текущий архив: 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