为什么小数点后的数字全为零?

Sun*_*nny 4 c c++ floating-point-precision

我想执行一些计算,我希望结果正确到一些小数位,比如12.所以我写了一个样本:

#define PI 3.1415926535897932384626433832795028841971693993751
double d, k, h;
k = 999999/(2*PI);
h = 999999;
d = PI*k*k*h;
printf("%.12f\n", d);
Run Code Online (Sandbox Code Playgroud)

但它给出了输出:

79577232813771760.000000000000
Run Code Online (Sandbox Code Playgroud)

我甚至使用了setprecision(),但相同的答案却是指数形式.

cout<<setprecision(12)<<d<<endl;
Run Code Online (Sandbox Code Playgroud)

版画

7.95772328138e+16
Run Code Online (Sandbox Code Playgroud)

使用长双,但徒劳无功.

除了在long long int类型中分别存储整数部分和小数部分之外,还有什么办法吗?

如果是这样,可以做些什么来准确得到答案?

And*_*rus 6

双精度只有大约16位十进制数.小数点后的所有内容都是无稽之谈.(事实上​​,该点的最后一个数字或两个数字可能与无限精度计算不一致.)

AFAIK长双不标准化.可能是在您的系统上它与double相同,或者不再精确.这会让我感到有些惊讶,但它并没有违反任何规定.