【问题标题】:C++ mathematical problem and 5/4*pi vs 5*pi/4 [closed]C++ 数学问题和 5/4*pi vs 5*pi/4 [关闭]
【发布时间】:2019-02-24 12:01:12
【问题描述】:
#define M_PI acos(-1.0)

int main()
{
    double z1 = sin(M_PI / 2 + 3 * x) / (1 - sin(3 * x - M_PI));
    double z2 = 1 / tan(5 * M_PI / 4 + 3 * x / 2);  // line 14
    double z3 = 1 / tan(5 / 4 * M_PI + 3 * x / 2);  // line 15

    printf("%lf, %lf, %lf, z1, z2, z3);
}

所以你可以在第 14 行和第 15 行看到我们有非常相似的表达式。那么为什么我们会得到不同的结果呢?

【问题讨论】:

  • 请在问题中发布您的代码,而不是截图。
  • 将代码放入问题中,省略图像
  • 如果图片被代码替换,这将是一个很好的问题。我不明白的是,为什么现在认为拍摄屏幕照片并将其粘贴为图像而不是复制并粘贴到问题编辑器中更快!
  • 因为5/4 == 15./4 == 1.25
  • 顺便说一句,如果你想强制浮点,那么你可以重写为5.0 * M_PI / 4.05.0 / 4.0 * M_PI,但即使是这些也可能导致略有不同的结果

标签: c++ c visual-studio math visual-c++


【解决方案1】:

5 / 4 * M_PI 被分组为(5 / 4) * M_PI,而5 / 4 在整数运算中被评估,即1

以另一种方式编写它会强制将其他系数转换为浮点数。

(最后一点,任何常见的浮点方案(包括 IEEE754)都不能保证华丽的定义 #define M_PI acos(-1.0) 在您的平台上的浮点类型允许的精度范围内恢复 pi 的数学值。最好手写。)

【讨论】:

    【解决方案2】:

    这是因为以下两个操作不同:

    5 * M_PI / 4
    

    5 / 4 * M_PI
    

    操作从左到右执行。

    在第一行,5 * M_PI (int * float) 返回一个浮点数 (15.7...),该浮点数除以一个返回浮点数 (3.9...) 的 int (float / int)。

    在第二行,5 / 4 返回一个等于 1 的 int (int / int),然后乘以 M_PI (int * float) 返回一个浮点数,它正好返回 M_PI (3.14...)

    哪些是不同的结果。

    【讨论】:

    • 不一定执行,只是分组。
    • 它们是在编译开始之后和执行结束之前的某个时间点执行的。
    【解决方案3】:

    由于/* 具有相同的运算符优先级,因此表达式的计算取决于关联性。关联性表示在表达式中应用同等优先级的运算符的顺序。这里的关联性是从左到右的。请参阅operator precedence 表。

    所以 5 / 4 * M_PI (5 / 4) * M_PI(5 / 4) 是整数除法,计算结果为 1。 而5 * M_PI / 4 (5 * M_PI) / 4 会导致浮点除法,因为5 * M_PI 是浮点值。

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      相关资源
      最近更新 更多