Загуба на точност при добавяне на двойки?

хора! Срещнах малък проблем: правя просто събиране с три двойни стойности. Резултатът е с по-малка точност от използваните стойности.

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