我正在阅读 CS:APP,关于演员阵容,它说在演员阵容时从int到float,数字不能溢出,但可能会被四舍五入。
这对我来说很奇怪,因为我不知道要舍入什么,所以我尝试了一下。我认为这只适用于非常大的整数(接近INT_MAX
/INT_MIN
),但四舍五入也会发生在一亿左右的值。 (不确定这首先发生在哪里)。
为什么会出现这种情况?范围为float
远远超过int
。有人可能会说浮点数不能精确表示,但是当从int
to double
价值没有变化。优点double
over 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
我假设通过float
你的意思是一个 32 位 IEEE-754 二进制浮点值,通过double
您的意思是 64 位 IEEE-754 二进制浮点值,并且int
你的意思是一个32位整数。
为什么会出现这种情况? float的范围远远超过int
是的,但是精确 of float
只有 7-9 位小数。更具体地说,有效数只有 24 位宽……所以如果您尝试在其中存储 32 位信息,就会遇到问题。
但是当从int
to double
价值没有变化
当然,因为一个double
有一个 53 位有效数 - 这里有足够的空间容纳 32 位整数!
换个角度想,连续之间的差距int
值始终为 1...而连续值之间的差距float
值开始时非常非常小...但随着值大小的增加而增加。在达到极限之前它就已经达到“超过 2”int
...所以你到达了一个阶段,不是每个int
可以准确表示。
To think of it another way, you can simply use the pigeon-hole principle... even ignoring NaN values, there can be at most 232 float
values, and at least one of those is not the exact value of an int
- take 0.5, for example. There are 232 int
values, therefore at least one int
value doesn't have an exact float
representation.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)