【问题标题】:C++ double multiplication have different result when order of variables is change. [duplicate]当变量的顺序改变时,C++ 双倍乘法有不同的结果。 [复制]
【发布时间】:2018-06-13 19:11:54
【问题描述】:

可以告诉我在 c++ 中使用双数据类型的乘法行为吗?在下面的示例程序中,我有三个 double 类型的变量 (x,y,z)。当我将这些变量相乘时,产品会根据顺序而有所不同。请记住,我在示例中使用的值是我的示例计算值。

void main()
{
    double x, y, z;
    double prod1, prod2;

    x = 8.3832170034737544e-05;
    y = 5.6690000000000000e-08;
    z = 0.29999999999999999;

    prod1 = x*y*z;
    prod2 = y*z*x;

}

结果:

prod1 : 1.4257337157807814e-12
prod2 : 1.4257337157807812e-12

在上面的示例中,prod1prod2 的结果不同。 我该如何解决这个问题,无论 (x,y,z) 的顺序是什么并使用完全相同的值,我总是可以得到相同的结果。

【问题讨论】:

  • 双精度只适用于大约 15 位数字。在那之后你会感到你最好忽略它。果然,差异大约是 16 位数。你赢不了这场战斗,所以别担心。
  • 这是浮点运算的一个属性。你无法“修复”它。

标签: c++ types overflow precision


【解决方案1】:

因为浮点类型的精度。

double 保证精度为小数点后 15 位。

如果你愿意,你可以使用 long double 类型。 但它不是 IEEE-754 强制要求的

#include <iostream>

int main(void)
{
    long double x, y, z;
    long double prod1, prod2;

    x = 8.3832170034737544e-05;
    y = 5.6690000000000000e-08;
    z = 0.29999999999999999;

    prod1 = x*y*z;
    prod2 = y*z*x;

    std::cout.precision(17);
    std::cout << prod1 << std::endl;
    std::cout << prod2 << std::endl;

    return 0;
}

结果

1.4257337157807814e-12
1.4257337157807814e-12

【讨论】:

  • 这并不能解决任何问题。它只是将问题“解决”(可以这么说)。 IE。同样的问题可以用不同的值以更高的精度产生。 OP 需要学习和理解浮点数学的原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多