为什么要从整型转换为浮点型? [英] Why does a cast from int to float round the value?
问题描述
我正在读CS:APP,关于强制转换,它说在将从整型强制转换为浮点型时,数字不能溢出,但可以四舍五入。
这对我来说似乎很奇怪,因为我不知道有什么可以绕过去的,所以我试过了。我认为这只适用于非常大的整数(接近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
推荐答案
我假设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值,最多可以有232float
值,并且其中至少有一个值不是int
的精确值-例如0.5。有2个32int
值,因此至少有一个int
值没有精确的float
表示形式。
这篇关于为什么要从整型转换为浮点型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!