c++ - 文字双精度到浮点转换是否等于浮点文字?
问题描述
直接分配浮点文字float x = 3.2f;
和double
隐式转换为浮点数之间的位表示是否存在差异float x2 = 3.2;
?
即是
#define EQUAL(FLOAT_LITERAL)\
FLOAT_LITERAL##f == static_cast<float>(FLOAT_LITERAL)
EQUAL(3.2) && EQUAL(55.6200093490) // etc ...
true
对于所有浮点文字?
我问这个问题,因为如果数字在 float 的值范围内,clang 或 gcc 不会抱怨缩小转换:使用以下命令启用警告-Wnarrowing
:
float f {3.422222222222222222222222222222246454}; // no warning/ error although it should definitely lose precision
float f2 {static_cast<double>(std::numeric_limits<float>::max()) + 1.0}; // no warning/ error
float f3 {3.5e38}; // error: narrowing conversion of '3.5e+38' from 'double' to 'float' inside { } [-Wnarrowing]
编译器进行实际范围检查很棒,但这是否足够?
解决方案
Patricia 给出的答案是正确的。但是我们通常不输入这样的数字,所以也许这不是问题......除非它发生在一些较短的十进制文字上?
我曾经在该答案后面的评论中说明了Count number of digits after `.` in floating point numbers?
十进制值 7.038531e-26 约为 0x1.5C87FAFFFFFFCE4F6700...p-21,最接近的双精度为 0x1.5C87FB0000000p-21,最接近的浮点数为 0x1.5C87FAp-21。
请注意,0x1.5C87FA0000000p-21 是最接近 7.038530691851209e-26 的双精度
所以是的,可能存在双舍入问题(在同一方向上舍入误差两次),文字相对较短......
float x = 7.038531e-26f;
如果编译器正确地对文字进行四舍五入,float y = 7.038531e-26;
则应该是两个不同的数字。
推荐阅读
- eclipse - 无法在 Eclipse 中连接/克隆 GitLab 存储库,即使能够从命令行连接到它
- php - PHP mcrypt to openssl BF-CBC:如何获得相同的加密值
- java - 收集器分组按类型推断失败
- python - 仅保存 TensorFlow 图的架构
- angularjs - 量角器中的 For 循环在该循环中的最后一个数字处给出错误“使用定位器找不到元素:By(css 选择器,span.ng-binding)”
- swift - 第一个 TableView 部分标题不滚动 Swift 4
- jsf - Primefaces 组件的属性值何时更新?
- c# - 为什么我的 cancelTokenSource 会抛出空对象异常?
- php - Symfony bundle - REST API 两种类型的身份验证
- rxjs - 用其他 Observable 替换已经有订阅者的 Observable