Vil*_*ray 4 c floating-point c99 ieee-754 floating-point-conversion
将整数值转换为浮点值并再次返回与原始整数值相同吗?
例如:
unsigned x = 42;
double y = x;
unsigned z = y;
Run Code Online (Sandbox Code Playgroud)
假设编译器没有优化浮点转换,x == z总是会计算为true?
我怀疑浮点转换中的任何表示错误总是会增加值.因此,当浮点值转换回整数值时,将截断该值,该值始终导致原始整数值.
我的假设是否正确?
Pas*_*uoq 11
假设IEEE 754采用IEEE 754双精度格式double,表达式x == z将评估最高为2 53的1所有值.例如,如果您的编译器提供32位,则表示所有可能的值.xunsigned intx
您已编辑了问题,询问有关从整数到浮点数的转换.在大多数C实现中,此转换根据FPU舍入模式进行舍入,默认情况下,舍入为舍入到最近.那里有从float到integer的转换的不对称性(正如你所指出的,从float到int的转换总是截断).
但是,从整数到浮点数的转换中的任何错误都不意味着你得到一个没有的小数部分,但是你得到的错误整数.例如,整数2 53 +1被转换为double表示2 53的整数.因此,即使从float到integer的转换总是向上舍入,从float转换为整数也无济于事.
从整数到浮点数的转换中的舍入误差可以大于1:5555555555555555555当转换为整数时,整数double被舍入到5555555555555555328,这恰好比二者更简单地表示二进制.一半时间,舍入向上:例如5555555555555555855四舍五入到5555555555555556352.