c++ - 可以进行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);
目的似乎是将双精度降低到单精度。它闻起来像是出于极度的偏执狂写的东西。
解决方案
static_cast<float>(x)
需要去除任何多余的精度,产生float
. 虽然 C++ 标准通常允许实现在表达式中保留多余的浮点精度,但该精度必须由强制转换和赋值运算符删除。
使用更高精度的许可在 C++ 草案 N4659 第 8 条第 13 段中:
浮动操作数的值和浮动表达式的结果可以用比类型要求更高的精度和范围来表示;类型不会因此而改变。64
脚注 64 说:
强制转换和赋值运算符仍必须执行其特定的转换,如 8.4、8.2.9 和 8.18 中所述。
推荐阅读
- android - 无法将 Kotlin-android-extension 与 Kotlin/native 一起使用
- c - GDB 不允许我读取 argv 内存段
- c# - 从列表框中获取多项选择
- ruby - 尝试使用 chromedriver 运行测试的问题
- html - Bootstrap 4 手风琴在角度 4 中导航
- javascript - 根据php ci中的指定值绘制自定义形状和填充颜色
- laravel - 使用 laravel-snappy 生成空白内容 PDF
- postgresql - 从属中的 Postgres 复制 .done 文件
- azure - 如何将托管在云上的 MySQL 数据库连接到 Azure 数据工厂?
- c# - 如何使用 c# 进行多个浏览器操作?