Я имею дело с кодом, который использует очень маленькие номера порядка 10^-15 до 10^-25. Я пробовал использовать double
и long double
, но я получаю неправильный ответ, так как либо 0.000000000000000000001
округляется до 0
, либо число, подобное 0.00000000000000002
представлено как 0.00000000000000001999999999999
.C++ очень маленький номер с плавающей запятой, preciscion
Так как даже небольшая часть 1/1000000 имеет огромное значение в моих окончательных ответах, есть ли подходящее исправление?
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;
int main()
{
double sum, a, b, c,d;
a=1;
b=1*pow(10,-15);
c=2*pow(10,-14);
d=3*pow(10,-14);
sum=a+b+c+d;
cout<<fixed;
cout<<setprecision(30);
cout<<" a : "<<a<<endl<<" b : "<<b<<endl<<" c : "<<c<<endl
<<" d : "<<d<<endl;
cout<<" sum : "<<sum<<endl<<endl;
a=a/sum;
b=b/sum;
c=c/sum;
d=d/sum;
sum=a+b+c+d;
cout<<" a : "<<a<<endl<<" b : "<<b<<endl<<" c : "<<c<<endl
<<" d : "<<d<<endl;
cout<<" sum2: "<<sum<< endl;
return 0;
}
Ожидаемый результат должен быть:
a : 1.000000000000000000000000000000
b : 0.000000000000001000000000000000
c : 0.000000000000020000000000000000
d : 0.000000000000030000000000000000
sum : 1.000000000000051000000000000000
a : 1.000000000000000000000000000000
b : 0.000000000000001000000000000000
c : 0.000000000000020000000000000000
d : 0.000000000000030000000000000000
sum1: 1.000000000000051000000000000000
Но выход я получаю:
a : 1.000000000000000000000000000000
b : 0.000000000000001000000000000000
c : 0.000000000000020000000000000000
d : 0.000000000000029999999999999998
sum : 1.000000000000051100000000000000
a : 0.999999999999998787999878998887
b : 0.000000000000000999999997897899
c : 0.000000000000019999999999999458
d : 0.000000000000029999999999996589
sum1: 0.999999999999989000000000000000
Я попытался double
, long double
и даже boost_dec_float
, но на выходе я получаю аналогичный.
Создайте структуру, которая является вашим собственным представлением числа; с коротким для экспоненциального и двойным для остальных; Или, может быть, измените единицы так, чтобы вы не работали с такими маленькими номерами? – UKMonkey
Я бы сказал, что это не дубликат. OP точно знает, что происходит, и просит решение повысить точность. – SingerOfTheFall
Итак, ваша проблема заключается в том, что '3 * pow (10, -14)' отображается как 0,000000000000029999999999999998, а не 0,000000000000030000000000000000. Это в значительной степени зависит от точности двойной. –