我的 C++ 编译器(带有
-Wdouble-promotion
的 Clang)会警告隐式浮点转换,如
some_long_double_value() > 1.0
虽然我理解双常量
1.0
为了比较而隐式转换为long double
值,但我不明白为什么这是值得警告的。
我知道隐式浮点转换在某些情况下可能是不可取的,例如重载解析。但我认为为了比较,这是完全无害的。或者我在这里遗漏了一些东西,例如边框或特殊的硬件情况?
何时需要警告隐式浮点提升?
当代码的文字具有不同的值(如
double
与 long double
)时,代码将具有不同的功能。通过在比较中使用匹配类型,它更有可能是预期的代码并注意因果错误。
考虑与 1.0 不同的值。
some_long_double_value() > 0.1
// versus
some_long_double_value() > 0.1L
十进制文本中的文字可能具有不同的值,因为
(long double) 0.1
不一定与 0.1L
相同。
样品:
0.1 --> 0x1.999999999999ap-4
0.1L --> 0x1.999999999999999ap-4
如果代码确实需要将
long double
与 double
进行比较,请明确说明。使用强制转换,或者更类似于 C++ 的东西。考虑评论这样的代码,即使有强制转换,它看起来也不对劲。
some_long_double_value() > (long double) 0.1 /* Cast used intentionally */