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

What is the correct way to use C++ style casts to perform an expression at a desired precision?

本文关键字:表达式 执行 是什么 方法 精度 使用 转换 样式 C++      更新时间:2023-10-16

给定以下内容:

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) + ... ?

首先更正代码:

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

产生7.33333,而正确的结果是8.33333。为什么?因为b/yc/z划分是在 int 秒(演示(中完成的。

结果不正确的原因是除法优先于加法:您的程序需要将b除以 yc除以 z,然后再将它们添加到a除以 x 的结果中,这是float

您需要强制转换其中一个除法操作数才能使其正常工作。C 强制转换工作正常,但如果您更愿意使用C++式转换,以下是您可以做到的方法:

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

优先级高于+,所以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的演员比分割更紧密。

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

如果要返回所有除法之和的float值,则不正确。 在上面的表达式中,只有a/xfloat除法,其余的int除法(因为/运算符的海格优先级高于+(,这将导致值截断。最好坚持下去

return (double)a/x + (double)b/y + (double)c/z + d;    
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或向int添加float会导致int自动转换为float s。

如果要进行浮点除法,

则需要插入强制转换,以便在除法之前应用它们,然后自动提升其他值。

    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;

只有在除法操作时才需要铸造。您可以通过以下方式减轻语法:

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

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