【问题标题】:Why does multiplying two large double numbers give a wrong result?为什么将两个大的双精度数相乘会得到错误的结果?
【发布时间】:2013-05-10 17:42:40
【问题描述】:

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

#include <iostream>
#include <iomanip>

using namespace std;

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

【问题讨论】:

    标签: c++ double


    【解决方案1】:

    当您对double 值进行乘法运算时,结果并不精确。 double 有一个固有的精度,虽然相当准确,但不足以准确地代表您的价值。

    我推荐阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

    【讨论】:

    • 准确地说,将两个doubles 相乘非常精确,只是不够准确。 (你总是会得到相同的答案,并且可以事先确定,但如果你的double 的心理模型是实数,它就不是“正确”的答案)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-02-06
        • 1970-01-01
        • 2018-06-01
        • 2021-12-22
        • 2014-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多