使用C++样式转换以所需的精度执行表达式的正确方法是什么
What is the correct way to use C++ style casts to perform an expression at a desired precision?
给定以下内容:
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/y
和c/z
划分是在 int
秒(演示(中完成的。
结果不正确的原因是除法优先于加法:您的程序需要将b
除以 y
和c
除以 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/x
是float
除法,其余的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/y
和c/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
。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 如何在没有外部库的情况下使用C++03约束执行基于正则表达式的字符串操作
- 通过调试来检查C 中单行表达式执行顺序的方法
- 对 std::string 执行正则表达式搜索和替换
- 如何修复:在c++中使用pthread执行lambda表达式
- 是否存在将String转换为可执行的c++表达式的方法
- When是bool a|=mayRun()的右手表达式;正在执行
- 在浮点运算上执行平方运算和平方根运算时:表达式必须具有整型或非整型枚举类型
- 执行基本的 for 循环并得到错误:")"之前的预期主表达式
- 在C或C++中高效执行位图上的布尔表达式
- 在使用正则表达式执行函数时逐行解析inffile
- RETURN语句中的表达式将被执行
- 在c++中,包含后增量的表达式能否与该表达式的其他部分并行执行?
- 是否执行decltype内的表达式,或者只是检查是否验证
- 使用C++样式转换以所需的精度执行表达式的正确方法是什么
- 具有未定义行为但从未实际执行的表达式是否会使程序出错
- 频繁执行的表达式是否会缓存其结果
- 对内存分配和构造函数的调用是否可以与执行"new"表达式所需的其他操作交错?
- 在c++中高效地执行数学Python表达式