【发布时间】:2015-02-04 15:56:26
【问题描述】:
我正在阅读 CS:APP,关于强制转换,它说当将 从 int 转换为 float 时,数字不会溢出,但可能会被四舍五入。
这对我来说似乎很奇怪,因为我不知道要舍入什么,所以我尝试了一下。我认为这只适用于非常大的整数(靠近INT_MAX/INT_MIN),但舍入也发生在大约一亿的值上。 (不确定首先发生在哪里)。
为什么会这样? float的范围远远超过int的范围。有人可能会说浮点数不能精确表示,但是当从int 转换为double 时,值没有变化。 doubleover float 的优势在于它具有更大的范围和精度。但是float仍然有足够的范围来“封装”整数,并且精度应该不重要,因为整数没有小数位(嗯,全为 0),还是我想错了?
这是我得到的一些输出(这里是代码:http://pastebin.com/K3E3A6Ni):
FLT_MAX = 340282346638528859811704183484516925440.000000
INT_MAX = 2147483647
(float)INT_MAX = 2147483648.000000
(double)INT_MAX = 2147483647.000000
INT_MIN = -2147483648
(float)INT_MIN = -2147483648.000000
====other values close to INT_MIN INT_MAX====
INT_MAX-1 = 2147483646
(float)INT_MAX-1 = 2147483648.000000
INT_MIN+1 = -2147483647
(float)INT_MIN+1 = -2147483648.000000
INT_MAX-2 = 2147483645
(float)INT_MAX-2 = 2147483648.000000
INT_MAX-10 = 2147483637
(float)INT_MAX-10 = 2147483648.000000
INT_MAX-100 = 2147483547
(float)INT_MAX-100 = 2147483520.000000
INT_MAX-1000 = 2147482647
(float)INT_MAX-1000 = 2147482624.000000
(float)1.234.567.809 = 1234567808.000000
(float)1.234.567.800 = 1234567808.000000
(float)1.000.000.005 = 1000000000.000000
(float)800.000.003 = 800000000.000000
(float)500.000.007 = 500000000.000000
(float)100.000.009 = 100000008.000000
【问题讨论】:
-
趣事:
2147483647.0f == 2147483648.0f -
@dmg 有趣的事实不取决于舍入模式吗?
-
浮点数通过否定证明了上帝的存在,因为它们显然是撒旦的作品。 :-)
-
@Bob Jarvis Satire 不谈,The Father of Floating Point 和其他人进行了稳健、有效的长期 FP 设计。