Cri*_*dru 4 c++ floating-point integer integer-arithmetic
当我遇到问题时,我正在编写一个函数来计算球体的体积,但我不知道为什么如果将 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
}
Run Code Online (Sandbox Code Playgroud)
根据 C++ 标准(5.6 乘法运算符)
1 乘法运算符 *、/ 和 % 从左到右分组。
因此这个表达式
4/3 * PI
Run Code Online (Sandbox Code Playgroud)
被评估为
( 4/3 ) * PI
Run Code Online (Sandbox Code Playgroud)
所以在这个子表达式4 / 3中使用了整数算术,结果等于1。
这个表情
PI * 4/3
Run Code Online (Sandbox Code Playgroud)
也是从左到右评估的
( PI * 4 )/3
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,使用了浮点算法。由于通常的算术转换,操作数4被转换为PI具有 double类型的变量的类型。然后操作数3也被转换为 double 类型,因为它的左操作数(表达式)( PI * 4 )具有 double 类型。
在这个表达式中
PI * (4/3)
Run Code Online (Sandbox Code Playgroud)
括号内再次使用整数运算,子表达式的结果是1。