首页 > 解决方案 > 可以进行static_cast吗从双,分配到双被优化掉?

问题描述

我偶然发现了一个我认为不必要的功能,并且通常让我害怕:

float coerceToFloat(double x) {
    volatile float y = static_cast<float>(x);
    return y;
}

然后像这样使用它:

// double x
double y = coerceToFloat(x);

这与仅仅这样做有什么不同吗?:

double y = static_cast<float>(x);

目的似乎是将双精度降低到单精度。它闻起来像是出于极度的偏执狂写的东西。

标签: c++castingfloating-point

解决方案


static_cast<float>(x)需要去除任何多余的精度,产生float. 虽然 C++ 标准通常允许实现在表达式中保留多余的浮点精度,但该精度必须由强制转换和赋值运算符删除。

使用更高精度的许可在 C++ 草案 N4659 第 8 条第 13 段中:

浮动操作数的值和浮动表达式的结果可以用比类型要求更高的精度和范围来表示;类型不会因此而改变。64

脚注 64 说:

强制转换和赋值运算符仍必须执行其特定的转换,如 8.4、8.2.9 和 8.18 中所述。


推荐阅读