【发布时间】:2016-10-27 11:13:02
【问题描述】:
告诉 C++ 编译器“只警告我不知道的浮点转换”的正确/推荐方式是什么?
在 C 语言中,我将启用与浮点转换相关的警告,然后使用显式 C 样式强制转换来消除与受控制的转换相关的警告。
例如,计算a*a*a - b*b 很容易在单精度浮点中溢出,因此您可能希望以双精度计算它,以后只使用单精度:
double a = 443620.52;
double b = 874003.01;
float c = (float)(a*a*a - b*b);
上述 C 风格的显式转换将使编译器关于从 double 转换为 float 的警告静音。
阅读有关强制转换的 C++ 文档,我得出结论,在 C++ 中执行此操作的正确方法如下:
double a = 443620.52;
double b = 874003.01;
float c = static_cast<float>(a*a*a - b*b);
但是,这真的是在 C++ 中执行此操作的正确方法吗?
我理解 static_cast 语法为 ugly on purpose 背后的基本原理,因此您可以尽可能避免强制转换。
是的,我可以省略显式强制转换为浮动。但是然后我需要禁用告诉我精度损失的编译器警告(否则我会收到许多不相关的警告,这些警告会让人很难注意到真正相关的警告)。如果我禁用 fp 相关的编译器警告,当我在其他代码位置错误地丢失精度时,我将失去被警告的可能性。
那么,在 C++ 中进行浮点转换的正确方法是什么?
【问题讨论】:
标签: c++ casting floating-point