Потеря точности при добавлении двойников?

близкие! Я столкнулся с небольшой проблемой: я делаю простое сложение с тремя двойными значениями. Результат имеет меньшую точность, чем используемые значения.

double minutes = 3;
minutes = minutes / (24.0*60.0);  // contains 0.00208333
double hours = 3;
hours = hours / 24.0; // contains 0.125
double days = 3; // contains 3 

double age = days + hours + minutes; // result is 3.12708 

Я не нашел способа избежать этого поведения.


person XQDev    schedule 20.06.2013    source источник
comment
Как вы проверяете значение ваших переменных?   -  person Spook    schedule 20.06.2013
comment
В чем проблема? Расчет вроде нормальный. Как распечатать результат? Вы хотите, чтобы было напечатано больше цифр?   -  person zch    schedule 20.06.2013
comment
обратите внимание, что: 1) в зависимости от того, как вы выводите свои значения, вы можете не видеть все значащие цифры и 2) удвоения не могут точно представлять такие значения, как 0,1   -  person PlasmaHH    schedule 20.06.2013
comment
Re: точность: все четыре печатают шесть значащих цифр. В чем разница?   -  person Thilo    schedule 20.06.2013
comment
Я получаю 3.127083333333333. Мне кажется, это правильно.   -  person Mats Petersson    schedule 20.06.2013
comment
Как получить результат? printf() %g %f?   -  person Mario    schedule 20.06.2013
comment
возможный дубликат -- stackoverflow.com/questions/554063/   -  person 0decimal0    schedule 20.06.2013


Ответы (3)


Кажется, в расчетах нет ничего плохого, как говорится в комментариях к вашему сообщению.

Если вы хотите получить более точную информацию, поищите setprecision().

person Chris Wijaya    schedule 20.06.2013
comment
Расчет, действительно, правильный. Я проверил это с помощью printf(). Потеря точности была вызвана выводом std::cerr или назначением std::stringstream. setprecision сделал свое дело. Большое спасибо! - person XQDev; 20.06.2013

Нет проблем. Значимая цифра 0,00208333 и 3,12708 равна 6. Это правильный результат.

person qpalz    schedule 20.06.2013
comment
В моем случае это БЫЛО проблемой, даже если это не было плохим поведением. ;) - person XQDev; 20.06.2013

Иногда, чтобы получить значение в соответствии с желаемой точностью, нам нужно указать предел точности, вот мой код, который отлично работает, надеюсь, он поможет:

double minutes = 3;
minutes = minutes / (24.0*60.0);
double hours = 3;
hours = hours / 24.0; 
double days = 3;
double age = days + hours + minutes;
printf("%.8f",age);//here i have included the places of precision (.8)
person 0decimal0    schedule 20.06.2013