首页 > 解决方案 > 文字双精度到浮点转换是否等于浮点文字?

问题描述

直接分配浮点文字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]

编译器进行实际范围检查很棒,但这是否足够?

标签: c++mathfloating-point

解决方案


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;则应该是两个不同的数字。


推荐阅读