【问题标题】:What is the operations order of these two functions [duplicate]这两个函数的操作顺序是什么[重复]
【发布时间】:2020-04-28 22:40:56
【问题描述】:

当我遇到问题时,我正在编写一个计算球体体积的函数,但我不知道为什么如果我将 4/3 * PI 更改为 PI * 4/3 会得到不同的结果。 评估的顺序是什么,如果我使用 (4/3) * PI 和 PI * (4/3) 这样的括号,我在这两种情况下都得到了错误的答案。

#define PI 3.141592

float Volume(int radius){
      return (4/3 * PI * pow(radius, 3));
}

float Volume(int radius){
      return (PI * 4/3 * pow(radius, 3)); //the good one
}

【问题讨论】:

标签: c++ floating-point integer integer-arithmetic


【解决方案1】:

根据 C++ 标准(5.6 乘法运算符)

1 乘法运算符 *、/ 和 % 从左到右分组。

所以这个表达式

4/3 * PI 

被评估为

( 4/3 ) * PI 

所以在这个子表达式4 / 3 中使用了整数运算,结果等于1

这个表达式

PI * 4/3

也像从左到右一样进行评估

( PI * 4 )/3

但在这种情况下使用了浮点运算。由于通常的算术转换,操作数4 被转换为具有double 类型的变量PI 的类型。然后又将操作数3 也转换为双精度类型,因为它的左操作数(表达式)( PI * 4 ) 具有双精度类型。

在这个表达式中

PI * (4/3)

在括号内再次使用整数运算,子表达式的结果是1

【讨论】:

    【解决方案2】:

    要获得正确的结果,请强制答案为浮点数,如下所示:

    return 4.0/3 * PI * pow(radius, 3);
    

    另外,*/ 运算符具有相同的优先级,因此表达式将从左到右计算。所以在4/3 周围加上括号是对的,除了它会进行整数除法。

    【讨论】:

    • 如果您需要,最好全面使用浮点文字:return (4.0/3. * PI * pow(radius, 3.));。大多数现代编译器都会解决这个问题,但不依赖它会更明智、更清晰。
    • 有趣,我以前从未听说过。我经常看到人们把第一个数字做成浮点数,这样整个表达式就会是。
    猜你喜欢
    • 2020-06-27
    • 2010-10-14
    • 1970-01-01
    • 2018-07-06
    • 2019-11-18
    • 2011-10-10
    • 2022-06-11
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多