【发布时间】:2011-01-23 21:55:31
【问题描述】:
这可能是我刚刚遗漏的非常简单的东西,但是我在使用双精度数据类型时遇到了问题。它指出here C++ 中的 double 精确到 ~15 位。然而在代码中:
double n = pow(2,1000);
cout << fixed << setprecision(0) << n << endl;
n 存储 2^1000 的精确值,根据 WolframAlpha,它是 302 位十进制数字。然而,当我尝试计算 100!时,使用以下函数:
double factorial(int number)
{
double product = 1.0;
for (int i = 1; i <= number; i++){product*=i;}
return product;
}
第 16 位开始出现错误。有人可以解释一下这种行为,并为我提供某种解决方案。
谢谢
【问题讨论】:
-
按照设计没有什么可以解决的。
-
在网络上搜索“IEEE 754”并阅读。
-
不,该页面根本没有说明 double 是准确的。它只是说它可以跨越多少数字。准确性就是浮点的工作原理。
-
首先您说“这里声明 C++ 中的双精度数精确到约 15 位数字。”然后你说“第 16 位开始出现错误。有人可以解释一下这种行为”。你不是已经回答了你自己的问题吗?大致可以说,双精度数据类型可以“有效”存储约 15 位数字,但如果其中很多是零,它可以存储更多。
-
@njak32 你说得对,它是一个 302 位数字,在十进制系统中几乎没有任何零组。但是由于计算机使用二进制系统,所以数字 2^1000 只是“1”后面跟着一千个零。