10^-15 ~ 10^-25의 매우 작은 숫자를 사용하는 코드를 다루고 있습니다. 나는 double
과 long double
을 사용해 보았습니다. 그러나 0.000000000000000000001
이 0
으로 반올림되거나 0.00000000000000002
같은 숫자가 0.00000000000000001999999999999
으로 표시되면서 잘못된 대답을 얻습니다.C++ 매우 작은 부동 소수점 숫자, preciscion
1/1000000의 작은 부분만으로도 최종 답변에 큰 차이가 나기 때문에 적절한 수정 사항이 있습니까?
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
을하지만, 내가 얻을 출력은 다음과 같습니다 :
#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;
}
예상 출력해야 내가 double
, long double
심지어 boost_dec_float
을 시도
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
,하지만 난 얻을 출력은 비슷한.
구조체를 숫자로 나타내는 구조체를 만듭니다. 기하 급수적으로 짧고, 나머지는 두 배입니다. 그런 작은 숫자로 작업하지 않도록 단위를 변경 하시겠습니까? – UKMonkey
나는 이것이 중복 적이라고 주장 할 것이다. 영업 담당자는 무슨 일이 일어나고 있는지 정확하게 알고 정확성을 높이기위한 해결책을 요구하고 있습니다. – SingerOfTheFall
그래서 문제는'3 * pow (10, -14)'가 0.000000000000030000000000000000이 아닌 0.000000000000029999999999999998로 표시된다는 것입니다. 그것은 거의 double의 정밀도 한계에 있습니다. –