为什么乘以两个大的双数会得到错误的结果?

时间:2013-01-10 19:30:14

标签: c++ double

此双倍乘(双)1000000007 *(双)11111111的输出应以7结尾(或精确等于11111111077777777)。但是我编写的这段代码输出的结果以6结尾(或者准确地说等于11111111077777776)。我无法弄清楚我可能做错了什么。任何帮助都会很棒。

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    cout << setprecision(40) << (double)1000000007 * (double)11111111;
}

3 个答案:

答案 0 :(得分:7)

当您使用double值进行乘法时,结果并不准确。 double有一个固有的精度,虽然相当准确,但不够精确,无法准确表示您的价值。

我建议阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:2)

浮点数学并不准确,它只是非常准确。我建议你在这里阅读:http://en.wikipedia.org/wiki/Floating_point

基本上没有足够的位来准确表示该数字,因此会出现精度错误。

答案 2 :(得分:1)

你没有做错任何事。它与双打的实施有关。如果您需要超出双打实现的准确性,那么肯定有可用于“大数”操作的库。