| 二进制 | 十进制分数 | 十进制值 |
| 0.1 | 1/2 | 0.5 |
| 0.01 | 1/4 | 0.25 |
| 0.001 | 1/8 | 0.125 |
| 0.0001 | 1/16 | 0.0625 |
| 0.00001 | 1/32 | 0.03125 |
| 0.000001 | 1/64 | 0.015625 |
| 二进制 | 十进制分数 | 十进制值 |
| 10.101 | 2+1/2+1/8 | 2.625 |
| 10011.001 | 19+1/8 | 19.125 |
| 10110.1101 | 22+1/2+1/4+1/16 | 22.8125 |
| 1101.011 | 13+1/4+1/8 | 13.375 |



注意,二进制小数点左边的有效数为0。


(gdb) x/4xb &value2
0x8049094 <value2>: 0x00 0x00 0x80 0x48
(gdb) x/4xb &value3
0x8049098 <value3>: 0x00 0x00 0x80 0x48
。那这是为什么呢?原因是,规格化单精度浮点里,在小数点后有 23 位数,而 1.000...000 会经过 2^18 次方的运算后小数点会往前移动 18 个,那么小数点后面就只剩下 5 位,这时即使是 1/(2^5)=0.03125 都要比 0.01大,所以没办法,只能存为一样的数。



。10的308次幂是一个非常大的数,在1后面有308个十进制零。
value4:
.double 262144.00
value5:
.double 262144.01
(gdb) x/gf &value5
0x80490a4 <value5>: 262144.01000000001
0x804909c <value4>: 0x00 0x00 0x00 0x00 0x00 0x00 0x10 0x41
(gdb) x/8xb &value5
0x80490a4 <value5>: 0xa4 0x70 0x3d 0x0a 0x00 0x00 0x10 0x41
#include <stdio.h>
#include <math.h>
int main()
{
double total = 0;
int i;
total += 1 / pow(2, 7);
total += 1 / pow(2, 9);
for (i = 13; i < 17; i++)
total += 1 / pow(2, i);
total += 1 / pow(2, 18);
total += 1 / pow(2, 20);
total += 1 / pow(2, 21);
total += 1 / pow(2, 22);
total += 1 / pow(2, 27);
total += 1 / pow(2, 29);
total += 1 / pow(2, 32);
printf ("%lf\\n", total);
return (0);
}
beyes@beyes-groad:~/programming/assembly/float$ ./test.exe
0.010000
beyes@beyes-groad:~/programming/assembly/float$ ./test.exe
0.01000000000931323
| 欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |