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)