gpt4 book ai didi

c++ - literal double 到 float 的转换是否等于 float literal?

转载 作者:太空狗 更新时间:2023-10-29 20:08:16 26 4
gpt4 key购买 nike

浮点文字 float x = 3.2f; 的直接赋值和隐式转换为 float 的 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]

编译器进行实际范围检查很棒,但这就足够了吗?

最佳答案

假设 IEEE 754,float 为 32 位二进制,double 为 64 位二进制。

根据 IEEE 754 舍入到最近的规则,如果从首先从十进制转换为 double 然后再转换为 float 的结果直接从十进制转换为 float ,则小数部分的舍入方式不同。

例如,考虑 1.0000000596046447753906250000000000000000000000000001

1.000000059604644775390625 可以精确地表示为 double ,正好是 1.0 和 1.00000011920928955078125 之间的一半,即大于 1.0 的最小 float 的值。 1.0000000596046447753906250000000000000000000000000001 如果直接转换为 1.00000011920928955078125,因为它大于中点。如果先转为64位,则四舍五入取中点1.000000059604644775390625,再四舍五入取1.0。

关于c++ - literal double 到 float 的转换是否等于 float literal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com