我正在阅读CS:APP,关于演员表示,当将从int转换为float时,数字不会溢出,但可能会被舍入。
这对我来说似乎很奇怪,因为我不知道有什么回合,所以我已经尝试过了。我认为这只会是非常大的整数(INT_MAX
/ INT_MIN
附近)的情况,但是四舍五入也会发生四舍五入。 (不确定这首先发生在哪里)。
为什么会这样? float
的范围远远超过int
的范围。有人可能会说浮点数无法准确表示,但从int
转换为double
时,值没有变化。 double
优于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
答案 0 :(得分:9)
我假设float
表示32位IEEE-754二进制浮点值,double
表示64位IEEE-754二进制浮点值,并且int
你的意思是一个32位整数。
为什么会这样? float的范围远远超过int的范围
是的,但float
的精度仅为7-9位十进制数。更具体地说,有效数字只有24位宽...所以如果你试图在那里存储32位信息,你就会遇到问题。
但从
没有变化int
转换为double
时,值
当然,因为double
有一个53位有效数字 - 那里有足够的空间容纳32位整数!
以另一种方式来思考,连续int
值之间的差距始终为1 ......而连续float
值之间的差距开始非常非常小......但是随着幅度的增加而增加价值增加。在达到int
的限制之前,它会“超过2”...所以你到了不能每个int
都可以准确表示的阶段。
要想到它另一种方式,您可以简单地使用pigeon-hole principle ...甚至忽略NaN值,最多可以 2 32 float
值,其中至少有一个不是int
的确切值 - 例如,取0.5。有2个 32 int
值,因此至少有一个int
值没有精确的float
表示。
答案 1 :(得分:7)
使用32位IEEE-754表示实现的典型float
对有效数字只有24位,这允许大约7位十进制数字的精度。因此,一旦达到数百万(2 24 ≈16M),你就会看到四舍五入。
(对于double
,有效数字为53位,2 53 ≈9×10 15 。)