为什么从int转换为float值?

Bek*_*eko 6 c int casting 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  
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

我假设float你的意思是32位IEEE-754二进制浮点值,double你的意思是64位IEEE-754二进制浮点值,int你的意思是32位整数.

为什么会这样?浮动范围远远超过int的范围

是的,但精密float只有7-9个十进制数字.更具体地说,有效数字只有24位宽...所以如果你试图在那里存储32位信息,你就会遇到问题.

但是当转换intdouble没有价值变化时

当然,因为a double有一个53位有效数字 - 有足够的空间容纳32位整数!

换一种方式来看,连续int值之间的差距总是为1 ......而连续float值之间的差距开始非常非常小......但随着值的大小增加而增加.在达到...的极限之前,它会达到"超过2",int所以你进入了不能int完全代表每个人的阶段.

想起来了另一种方式,你可以简单地使用鸽子洞的原则 ......即使忽略NaN值,可以有最多 2倍32 float的值,以及那些至少一个不是一个精确值int-以0.5,例如.有2 32个 int值,因此至少有一个int值没有精确的float表示.


Ker*_* SB 7

float使用32位IEEE-754表示实现的典型值只有24位有效数字,允许大约7位十进制数字的精度.所以你会看到,一旦四舍五入为你打了几百万(2 24  ≈16M).

(对于一个double中,有效数有53位,和2 53  ≈9×10 15).