使用C++样式转换以所需精度执行表达式的正确方法是什么?

use*_*349 3 c c++ syntax casting

鉴于以下内容:

int a = 10, b = 5, c = 3, d = 1;
int x = 3,  y = 2, z = 2;

return (float) a/x + b/y + c/z + d;
Run Code Online (Sandbox Code Playgroud)

这可能会将我们的精度转换为浮动,然后以浮点精度执行我们的分割序列.

使用C++样式转换更新此方法的正确方法是什么?

真的应该改写为:

return static_cast<float>(a) / static_cast<float>(b) + ... ?
Run Code Online (Sandbox Code Playgroud)

das*_*ght 7

首先纠正您的代码:

(float) a/x + b/y + c/z + d
Run Code Online (Sandbox Code Playgroud)

产生7.33333,而正确的结果是8.33333.为什么?因为b/yc/z分裂是在ints(演示)完成的.

究其原因,结果是不正确的是分裂的优先级高于另外:你的程序需要来划分by,并c通过z 之前将它们添加到分工的结果a通过x,这是float.

您需要转换一个除法操作数才能使其正常工作.C cast工作正常,但如果你更愿意使用C++风格的演员,你可以这样做:

return static_cast<float>(a) / b + static_cast<float>(b) / y +
   static_cast<float>(c) / z + d;
Run Code Online (Sandbox Code Playgroud)


eca*_*mur 5

/具有更高的优先级+,因此b/y将执行int,而不是执行float.

执行每个除法的正确方法float是将至少一个操作数强制转换为float:

static_cast<float>(a)/x + static_cast<float>(b)/y + static_cast<float>(c)/z + d
Run Code Online (Sandbox Code Playgroud)

这比等效的C表达式更清晰:

(float) a/x + (float) b/y + (float) c/z + d
Run Code Online (Sandbox Code Playgroud)

这里需要先验知识才能认识到演员float要比分裂更紧密.