为什么从int转换为float值?

时间:2015-02-04 15:56:27

标签: c casting int rounding

我正在阅读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  

2 个答案:

答案 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 。)