-1

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

#include <iostream>
#include <iomanip>

using namespace std;

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

3 回答 3

7

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

我推荐阅读每个计算机科学家应该知道的关于浮点运算的知识

于 2013-01-10T19:35:35.770 回答
2

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

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

于 2013-01-10T19:35:23.807 回答
1

你没有做错什么。它与双打的实现有关。如果您需要超出双精度实现所提供的精度,那么肯定有可用于“大数字”操作的库。

于 2013-01-10T19:35:54.157 回答