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

时间:2014-06-19 16:30:13

标签: 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;

这可能会将我们的精度转换为浮点数,然后以浮点精度执行我们的除法序列。

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

真的 是否应该重写为:

return static_cast<float>(a) / static_cast<float>(b) + ... ?

5 个答案:

答案 0 :(得分:7)

首先纠正您的代码:

(float) a/x + b/y + c/z + d

生成7.33333,而正确的结果是8.33333。为什么?因为b/yc/z分区是在int s(demo)中完成的。

结果不正确的原因是除法优先于加法:您的计划需要将b除以y而将c除以z 之前< / em>将a除以x float,将其添加到return static_cast<float>(a) / b + static_cast<float>(b) / y + static_cast<float>(c) / z + d; 的结果中。

您需要投射其中一个分区操作数才能使其正常工作。 C cast工作正常,但如果你更愿意使用C ++风格的演员,你可以这样做:

{{1}}

答案 1 :(得分:5)

/的优先级高于+,因此b/y将在int中执行,而不是float

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

static_cast<float>(a)/x + static_cast<float>(b)/y + static_cast<float>(c)/z + d

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

(float) a/x + (float) b/y + (float) c/z + d

这里需要先验知识才能意识到float的强制转换比分裂更紧密。

答案 2 :(得分:1)

return (float) a/x + b/y + c/z + d; 
如果要返回所有分区总和的float值,则

不正确。在上面的表达式中,只有a/xfloat分区,其余部分为int分区(因为/运算符的优先级高于+),这将导致价值截断。最好坚持

return (double)a/x + (double)b/y + (double)c/z + d;    

答案 3 :(得分:0)

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;
  

这可能会将我们的精度转换为浮点数,然后以浮点精度执行我们的除法序列。

不,它会将a转换为float,因此a/x将作为浮点除法执行,但b/yc/z是整数除法。之后,在将整数除法结果转换为浮点数后计算总和。

这是因为强制转换只是另一个运算符,它们的优先级高于+/。将float除以int或将float添加到int会导致int自动转换为float

如果你想要浮点除法,那么你需要插入强制转换,以便在分割之前应用它们,然后自动提升其他值。

    return (float) a/x + (float) b/y + (float) c/z + d;

使用C ++语法进行转换是完全相同的,除了语法不会让你对实际投射的内容感到困惑:

return static_cast<float>(a)/x +  static_cast<float>(b)/y +  static_cast<float>(c)/z + d;

您还可以使用构造函数语法,它还具有清楚显示演员阵容的好处:

return float(a)/x +  float(b)/y +  float(c)/z + d;

或者你可以简单地使用临时变量:

float af = a, bf = b, cf = c;
return af/x + bf/y +  cf/z + d;

答案 4 :(得分:-1)

仅在分割操作时才需要施法。你可以用这种方式淡化语法:

return 1.0*a/x + 1.0*b/y + 1.0*c/z + d;

这会将结果计算为double类型,如果函数返回此类型,则会自动转换为float