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)
我假设float你的意思是32位IEEE-754二进制浮点值,double你的意思是64位IEEE-754二进制浮点值,int你的意思是32位整数.
为什么会这样?浮动范围远远超过int的范围
是的,但精密的float只有7-9个十进制数字.更具体地说,有效数字只有24位宽...所以如果你试图在那里存储32位信息,你就会遇到问题.
但是当转换
int到double没有价值变化时
当然,因为a double有一个53位有效数字 - 有足够的空间容纳32位整数!
换一种方式来看,连续int值之间的差距总是为1 ......而连续float值之间的差距开始非常非常小......但随着值的大小增加而增加.在达到...的极限之前,它会达到"超过2",int所以你进入了不能int完全代表每个人的阶段.
想起来了另一种方式,你可以简单地使用鸽子洞的原则 ......即使忽略NaN值,可以有最多 2倍32 float的值,以及那些至少一个不是一个精确值int-以0.5,例如.有2 32个 int值,因此至少有一个int值没有精确的float表示.
float使用32位IEEE-754表示实现的典型值只有24位有效数字,允许大约7位十进制数字的精度.所以你会看到,一旦四舍五入为你打了几百万(2 24 ≈16M).
(对于一个double中,有效数有53位,和2 53 ≈9×10 15).
| 归档时间: |
|
| 查看次数: |
1799 次 |
| 最近记录: |