Неточный double
От: O-Sam Россия  
Дата: 11.10.05 12:03
Оценка:
Не могу посчитать сумму чисел

int main()
{
    /* source data from excel
108,71239
1,21710
32,97870
81,96990
103,74735
135,49768
135,23260
65,00000
2156,32959
32,81410
30,28987
*/
    double total, v[11];
    total = 0;

    v[0]  = 108.71239;
    v[1]  = 1.21710;
    v[2]  = 32.97870;
    v[3]  = 81.96990;
    v[4]  = 103.74735;
    v[5]  = 135.49768;
    v[6]  = 135.23260;
    v[7]  = 65.00000;
    v[8]  = 2156.32959;
    v[9]  = 32.81410;
    v[10] = 30,28987;
    for (int i = 0; i < 11; i++)
        total += v[i];

    printf("%.5lf\n",total); // must be 2883.78928
    getch();
    return 0;
}

На выходе вместо 2883.78928 получаю 2883.49941
В чём дело?
Re: Неточный double
От: Инженер  
Дата: 11.10.05 12:08
Оценка:
Здравствуйте, O-Sam, Вы писали:

OS>Не могу посчитать сумму чисел


OS>
OS>int main()
OS>{
OS>    /* source data from excel
OS>108,71239
OS>1,21710
OS>32,97870
OS>81,96990
OS>103,74735
OS>135,49768
OS>135,23260
OS>65,00000
OS>2156,32959
OS>32,81410
OS>30,28987
OS>*/
OS>    double total, v[11];
OS>    total = 0;

OS>    v[0]  = 108.71239;
OS>    v[1]  = 1.21710;
OS>    v[2]  = 32.97870;
OS>    v[3]  = 81.96990;
OS>    v[4]  = 103.74735;
OS>    v[5]  = 135.49768;
OS>    v[6]  = 135.23260;
OS>    v[7]  = 65.00000;
OS>    v[8]  = 2156.32959;
OS>    v[9]  = 32.81410;  // <--- было 32,81410
OS>    v[10] = 30.28987;
OS>    for (int i = 0; i < 11; i++)
OS>        total += v[i];

OS>    printf("%.5lf\n",total); // must be 2883.78928
OS>    getch();
OS>    return 0;
OS>}
OS>

OS>На выходе вместо 2883.78928 получаю 2883.49941
OS>В чём дело?
Re: Неточный double
От: _Winnie Россия C++.freerun
Дата: 11.10.05 12:09
Оценка:
Здравствуйте, O-Sam, Вы писали:

OS>Не могу посчитать сумму чисел


OS>

OS>*/
OS>    double total, v[11];
OS>    total = 0;


OS>    v[10] = 30,28987; <- вот здесь запятая вместо точки ? Странно, что это так мало влияет на результат.

OS>

OS>На выходе вместо 2883.78928 получаю 2883.49941
OS>В чём дело?
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Неточный double
От: Инженер  
Дата: 11.10.05 12:09
Оценка:
тьфу... коммент читать строчкой ниже
Re: Неточный double
От: Bell Россия  
Дата: 11.10.05 12:16
Оценка:
Здравствуйте, O-Sam, Вы писали:

OS> v[10] = 30,28987;

В оригинале тоже запятая?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Неточный double
От: Erop Россия  
Дата: 11.10.05 12:49
Оценка:
Здравствуйте, _Winnie, Вы писали:

OS>>

OS>>    v[10] = 30,28987; <- вот здесь запятая вместо точки ? Странно, что это так мало влияет на результат.

OS>>


А почему странно? Вместо 30.28987 в v[10] записывается 30.0
На столько собственно и влияет
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Неточный double
От: Кодт Россия  
Дата: 11.10.05 12:57
Оценка: 11 (2)
Здравствуйте, _Winnie, Вы писали:

OS>>    v[10] = 30,28987; <- вот здесь запятая вместо точки ? Странно, что это так мало влияет на результат.


Не странно. Приоритет запятой ниже приоритета присваивания, получаем
( v[10] = 30 ) , 28987 ;

Результат выражения — число 28987, которое далее не используется. А в переменную запихали 30.

Кстати говоря, когда суммируются много плавающих чисел, имеет смысл применить алгоритм Хаффмана:
— упорядочить числа по возрастанию абсолютной величины
— складывать два самых маленьких числа (вынимая их из набора) и добавлять сумму обратно в набор
Это уменьшит ошибки денормализации.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.