【发布时间】:2013-12-07 12:23:24
【问题描述】:
将整数值转换为浮点值并再次返回与原始整数值相同吗?
例如:
unsigned x = 42;
double y = x;
unsigned z = y;
假设编译器不优化浮点转换,x == z 是否总是评估为 true?
我怀疑浮点转换中的任何表示错误将始终是值的增加。因此,当浮点值被转换回整数值时,该值被截断,这总是导致原始整数值。
我的假设正确吗?
【问题讨论】:
-
不,转化不会始终保持相同的价值或增加它。如果源值完全可表示,则没有错误。如果源值不能精确表示,则将其四舍五入到 最近 可表示值(在通常的默认舍入模式下),在其有效位的最低有效位(分数浮点格式的一部分)。所以舍入有时会向上,有时会向下。
-
@EricPostpischil 所以对于大于 253 的整数,可能会出现向下舍入的情况,这样当转换回整数时,截断的值小于原来的值(即
x == z可能导致0整数大于253)? -
是的,Pascal Cuoq 在his answer 中举了一个例子,253+1。请注意,当值转换回整数时,它不会被截断,因为它仍然是整数。例如,将 253+1 转换为
double得到 253。将其转换回 64 位整数格式会产生 253。这第二次转换是准确的;它不会截断或舍入,因为该值可以以新的目标格式(64 位整数)精确表示。 -
也有可能将大整数转换为双整数,导致最终值大于原始值。最常见的双舍入模式,即四舍五入到最接近,平数到偶数,被设计为同样频繁地向上和向下舍入。
标签: c floating-point c99 ieee-754 floating-point-conversion