为什么要从整型转换为浮点型? [英] Why does a cast from int to float round the value?

查看:24
本文介绍了为什么要从整型转换为浮点型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在读CS:APP,关于强制转换,它说在将从整型强制转换为浮点型时,数字不能溢出,但可以四舍五入。

这对我来说似乎很奇怪,因为我不知道有什么可以绕过去的,所以我试过了。我认为这只适用于非常大的整数(接近INT_MAX/INT_MIN),但舍入也是在上亿附近进行的。(不确定这种情况最先发生在哪里)。

为什么会发生这种情况?float的范围远远超过int。有人可能会说,浮点数不能准确表示,但当从int转换为double时,值没有变化。doublefloat的优势在于它具有更大的范围和精度。但是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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆