[原创]实数12.34 在IA32上你的样子 附IA-32浮点数的范围
发表于:
2006-8-27 10:45
9858
[原创]实数12.34 在IA32上你的样子 附IA-32浮点数的范围
loat abc=12.34;
double abc=12.34;
long double abc=12.34
它们在IA32下的内存中是个什么样子?噢,这是你应该知道的。这也是每个编译器隐藏的秘密。
C标准规定long double为16个字节,与IEE754的规定一样,但VC却实现为8字节。
By TnTTools,欢迎抄袭,转载。
转换算法
1. 规格化,基数为2
2. 将阶码加上偏移常量后转换成二进制数
3. 将尾数转换成二进制数
4. 组合 Step I.
在我们的脑海中应该有2,4,8,16,32,64,你可以继续数下去吗,128, 256, 512,1024.2048,4056,很明显,12.34位于8和16之间:
12.34 = 8*1.5425 = 1.5425 * (2^3) Step 2.
阶码是3,单精度数的偏移常量是127,双精度数的偏移常量是1023,
扩展双精度数的偏移量常量是16383。
127+3= 130 = 10000010
1023+3 = 1026 = 10000000010
16383+3=16386= 100000000000010 Step 3.
这是一段漫长的路程,你也许需要编写一个函数来完成它
将定点小数转换成二进制数是规格化乘二累进法。
0.5*2=1.0 0.1
0.25*2^2=1.0 0.01 Relative Abs
0.5425*2= 1.085 1 1
0.085*16= 1.36 4 5
0.36*4 = 1.44 2 7
0.44*4= 1.76 2 9
0.76*2= 1.52 1 10
0.52*2=1.04 1 11
0.04*32=1.28 5 16
0.28*4=1.12 2 18
0.12*16=1.92 4 22
0.92*2=1.84 1 23--------------------------float
0.84*2=1.68 1 24--------------------------是1,向上进一位
0.68*2=1.36 1 25--------------------------从此处开始闭包,不知道数学原理,以后有时间研究
0.36*4=1.44 2 27
0.44*4=1.76 2 29
0.76*2=1.52 1 30
0.52*2=1.04 1 31
0.04*32=1.28 5 36
0.28*4=1.12 2 38
0.12*16=1.92 4 42
0.92*2=1.84 1 43
0.84*2=1.68 1 44
0.68*2=1.36 1 45--------------------------从此处开始闭包,不知道数学原理,以后有时间研究
0.36*4=1.44 2 47
0.44*4=1.76 2 49
0.76*2=1.52 1 50
0.52*2=1.04 1 51
0.04*32=1.28 5 56---------------------------第53位为零,不进位
0.28*4=1.12 2 58
0.12*16=1.92 4 62
0.92*2=1.84 1 63
0.84*2=1.68 1 64---------第64位为1,进位 Step 4. 组合
Total
32=1+8+23
64=1+11+52
80=1+15+1+63
I. single precision
符号位为0,阶码位为 100 0001 0,尾数位为(MSL)
100 0101 0111 0000 1010 0011 + 1
结果为(MSL)
0100 0001 0100 0101 0111 0000 1010 0100
(KEY)414570A4
II. double precision
符号位为0,阶码位为100 0000 0010,尾数位为(MSL)
1000 1010 1110 0001 0100 0111 1010 1110 0001 0100 0111 1010 1110 + 0
结果为(MSL)
0100 0000 0010 1000 1010 1110 0001 0100 0111 1010 1110 0001 0100 0111 1010 1110
(KEY) 4028 AE14 7AE1 47AE 浮点数的范围――一个无聊研究
ByTnTTools, 欢迎抄袭,转载和改作者名以作博士论文。
vol 1, IA-32 Intel® Architecture Software Developer's Manual
______________________________________________________________
Table 4-2. Length, Precision, and Range of Floating-Point Data Types
Data Type Length Precision(Bits) Approximate Normalized Range Binary Decimal
Single Precision 32 24 2?126 to 2127 1.18 × 10?38 to 3.40 × 1038
Double Precision 64 53 2?1022 to 21023 2.23 × 10?308 to 1.79 × 10308
Double Extended Precision 80 64 2?16382 to 216383 3.37 × 10?4932 to 1.18 × 104932
------------------------------------
approximate
如上,连IA-32手册都不愿意算出格式能表示浮点数的精确范围。
这个变态工作只有交给我来完成。
幂最大可以表示
127
1023
16383
整数部分肯定是1,关键就是小数部分。
0.5 1
0.25 2
0.125 3
0.0625 4
0.03125 5
0.015625 6
0.0078125 7
0.00390625 8
0.001953125 9
0.0009765625 10
0.00048827125 11
...
本来想锲而不舍地继续写下去,忽然脑袋里灵光一现――等比数列,现在就简单了: 单精度浮点数:
1+1/2+1/4+1/8+1/16+...+(1/2)^23 = 2(1-(1/2)^23 *1/2) = 2-(1/2)^23
双精度浮点数:
1+1/2+1/4+1/8+1/16+...+(1/2)^52 = 2(1-(1/2)^52 *1/2) = 2-(1/2)^52
双精度扩展(IA-32实现):
1+1/2+1/4+1/8+1/16+...+(1/2)^63 = 2(1-(1/2)^63 *1/2) = 2-(1/2)^63 答案:
单精度浮点数
-( 2-(1/2)^23 ) * 2^(+127)
+( 2-(1/2)^23 ) * 2^(+127)
双精度浮点数
-( 2-(1/2)^52 ) * 2^(+1023)
+( 2-(1/2)^52 ) * 2^(+1023)
双精度扩展(IA-32实现)
-( 2-(1/2)^63 ) * 2^(+16383)
+( 2-(1/2)^63 ) * 2^(+16383)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课