Работа с очень малыми числами в C++
Ноль вниз голосовать
любимый
Я имею дело с кодом, который использует очень маленькие числа порядка от 10^-15 до 10^-25, я пытался использовать double и long double, но я получаю неправильный ответ, так как либо 0.000000000000000000001 округляется до 0, либо число типа 0.00000000000000002 представляется как 0.00000000000000001999999999999, так как даже небольшая доля 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; }
Ожидаемый результат должен быть
ответ : 1.000000000000000000000000000000
б : 0.000000000000001000000000000000
с : 0.000000000000020000000000000000
д : 0.000000000000030000000000000000
сумма: 1.000000000000051000000000000000
ответ : 1.000000000000000000000000000000
б : 0.000000000000001000000000000000
с : 0.000000000000020000000000000000
д : 0.000000000000030000000000000000
sum1: 1.000000000000051000000000000000
Но выход, который я получаю, таков
ответ : 1.000000000000000000000000000000
б : 0.000000000000001000000000000000
с : 0.000000000000020000000000000000
д : 0.000000000000029999999999999998
сумма: 1.000000000000051100000000000000
ответ : 0.999999999999998787999878998887
б : 0.000000000000000999999997897899
с : 0.000000000000019999999999999458
д : 0.000000000000029999999999996589
sum1: 0.999999999999989000000000000000
Я пробовал double, long double и даже boost_dec_float, но результат, который я получаю, похож.