这篇文章写得不错哦, http://www.cnblogs.com/catch/p/3604236.html
(1)对于浮点型数据的正数部分,只要在精度范围内,都可以正确表示。
float可以表示的数值位是23位,而int是32位,所以23位之内的int转换位float可以被精确表示。
但是,23位以后的就极可能不能被精确表示了。
例如,
显然,2^22转换位float可以被精确表示,
但是,2^24的int也可以被精确表示,虽然2^24超出了2^23 -1的flloat精度,但是float的指数部分可以表示2的倍数哦~
(2)对于浮点数的小数部分,其实是一个A1 = 1,Q = 1/2的一个等比数列。求和可以得出1-(1/2)^n,其中n>1,所以对于float,n <= 23.和的极限是1。
在浮点数的世界中,即使看似简单的0.1,表示起来叶很麻烦哦~都是用2^-1 + 2^ -2 + ...这样来累加无限逼近的哦~
对于上面,可以看到,浮点数其实是不准确的,所以我们在使用浮点数的时候也要注意哦~
还有对于浮点数的精度,其实是有效位的个数。因为浮点数的表示都是以统一的格式1.abcdef来表示的哦~不存在1001.0101这样的表示。
---------------------------------------------------------
还有,
这里顺便谈下十进制与二进制的转换。
记得,以前有个有趣的问题,就是N个苹果怎么划分成M份,才能无论顾客买多少个,都可以由M份拼凑出来。
答案是,2^n( n >= 0 ),当然4进制,5进制之类的都可以哦~
因为任何一个十进制整数都可以转换成一个二进制数。
所以,对于一个数X(无论什么进制)只要X/2,表示X右移1位,如果余数是1,那么上一次的末尾肯定是1,否在是0。记录下余数,然后每次除2表示指数增加2倍哦~
例如,
17 = 16 + 1 = 1*2^4 + 0*2^3 + 0*2^1 + 1
17/2 = 8 ...1 这里余下的1就是末尾那个1,可以知道二进制的末尾是1.
8/2 = 4 ... 0 这里的0就是倒数第二个0
4/2 = 2 ...0
2/2 = 1 这里小于2了,就没必要除了,最高位肯定是1。
其实,类似1001每次往右移一位,即如果个位是1则除2肯定是1,否则为0.
对于负数,也是类似,不过是由除以2变为了乘以2。
1.001 这样就相当于左移,如果个位是0,则为0,个位是1则是1,然后注意计算指数就行了。
例如,
0.5125 X2
1.025 个位 1 指数-1
0.025 X 2 去掉个位的1.
0.5 个位0 指数-2
1.0 个位1 指数-3
所以101* 2^-3 = 1.01 * 2^-1