【发布时间】:2013-04-02 15:03:37
【问题描述】:
我想执行一些计算,我希望结果正确到小数位,比如 12。 于是我写了一个样例:
#define PI 3.1415926535897932384626433832795028841971693993751
double d, k, h;
k = 999999/(2*PI);
h = 999999;
d = PI*k*k*h;
printf("%.12f\n", d);
但它给出了输出:
79577232813771760.000000000000
我什至使用了 setprecision(),但答案相同,而不是指数形式。
cout<<setprecision(12)<<d<<endl;
打印
7.95772328138e+16
也用过long double,但是没有用。
除了将整数部分和小数部分分别存储在 long long int 类型中之外,还有其他方法吗?
如果是这样,如何才能准确地得到答案?
【问题讨论】:
-
@EricLeschinski:整数乘以双精度数得到双精度数。
-
您的号码中有 16 位小数;你不能对
double期待更多。 (有时,您可以得到 17;之后,您会得到随机值 - 或零。)阅读“What Every Computer Scientist Should Know About Floating Point Arithmetic”论文 - 很容易在 SO 或 Internet 上找到。 -
一个双精度可以存储大约 16 位十进制数字,这似乎是您得到的大致内容?您希望得到什么结果?
-
@Sunny:不,不需要。在某些系统上,
long double与double相同。
标签: c++ c floating-point-precision