Не могу посчитать сумму чисел
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
В чём дело?
Здравствуйте, 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>В чём дело?
Здравствуйте, 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>В чём дело?
тьфу... коммент читать строчкой ниже
Здравствуйте, _Winnie, Вы писали:
OS>>
OS>> v[10] = 30,28987; <- вот здесь запятая вместо точки ? Странно, что это так мало влияет на результат.
OS>>
А почему странно? Вместо 30.28987 в v[10] записывается 30.0
На столько собственно и влияет
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, _Winnie, Вы писали:
OS>> v[10] = 30,28987; <- вот здесь запятая вместо точки ? Странно, что это так мало влияет на результат.
Не странно. Приоритет запятой ниже приоритета присваивания, получаем
( v[10] = 30 ) , 28987 ;
Результат выражения — число 28987, которое далее не используется. А в переменную запихали 30.
Кстати говоря, когда суммируются много плавающих чисел, имеет смысл применить алгоритм Хаффмана:
— упорядочить числа по возрастанию абсолютной величины
— складывать два самых маленьких числа (вынимая их из набора) и добавлять сумму обратно в набор
Это уменьшит ошибки денормализации.