Joh*_*ing 42 c c++ floating-point ieee-754
我有关于如何从基数10转换为IEEE 754浮点表示的示例
Number: 45.25 (base 10) = 101101.01 (base 2) Sign: 0
Normalized form N = 1.0110101 * 2^5
Exponent esp = 5 E = 5 + 127 = 132 (base 10) = 10000100 (base 2)
IEEE 754: 0 10000100 01101010000000000000000
Run Code Online (Sandbox Code Playgroud)
除了一段之外,这对我有意义:
45.25 (base 10) = 101101.01 (base 2)
Run Code Online (Sandbox Code Playgroud)
45是二进制的101101,没关系..但他们是如何获得0.25的.01?
Car*_*rum 125
简单的地方价值.在基地10,你有这些地方:
...... 10 3 10 2 10 1 10 0 .10 -1 10 -2 10 -3 ......
......数千,数百,数十,1.十分之一,千分之一,千分之一......
同样,在二进制(基数2)中你有:
...... 2 3 2 2 2 1 2 0 .2 -1 2 -2 2 -3 ......
...八个,四个,两个,一个.一半,宿舍,八分之一......
因此,.在二进制之后的第二位是2 -2的单位,众所周知为1/4(或者替代地,0.25)的单位.
mka*_*aja 30
您可以通过重复乘以新基数(在这种情况下新基数为2)将小数点后的部分转换为另一个基数,如下所示:
0.25 * 2 = 0.5
Run Code Online (Sandbox Code Playgroud)
- >第一个二进制数字为0(取整数部分,即小数点前的部分).
继续乘以小数点后的部分:
0.5 * 2 = 1.0
Run Code Online (Sandbox Code Playgroud)
- >第二个二进制数字是1(再次,取整数部分).
这也是我们停止的地方,因为小数点后面的部分现在为零,所以没有什么可以增加.
因此,小数部分的最终二进制表示为:0.01 2.
编辑:
可能值得注意的是,即使从基数10中的有限小数部分开始,二进制表示也是无限的.例如:将0.2 10转换为二进制:
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = ...
Run Code Online (Sandbox Code Playgroud)
所以我们最终得到:0.001100110011 ... 2.
如果二进制表示最终是无限的,那么使用这种方法很容易看到.
Moo*_*uck 13
其他基数中的"小数"(小数位)令人惊讶地不直观,因为它们的工作方式与整数完全相同.
base 10
scinot 10e2 10e1 10e0 10e-1 10e-2 10e-3
weight 100.0 10.0 1.0 0.1 0.01 0.001
value 0 4 5 .2 5 0
base 2
scinot 2e6 2e5 2e4 2e3 2e2 2e1 2e0 2e-1 2e-2 2e-3
weight 64 32 16 8 4 2 1 .5 .25 .125
value 0 1 0 1 1 0 1 .0 1 0
Run Code Online (Sandbox Code Playgroud)
如果我们从45.25开始,那么大于/等于32,那么我们添加一个二进制1,然后减去32.
我们留下13.25,小于16,所以我们添加一个二进制0.
我们留下了13.25 ,它大于/等于8,所以我们加一个二进制1,然后减去8.
我们留下05.25,它大于/等于4,所以我们加一个二进制1,然后减去4.
我们离开了使用01.25,小于2,所以我们加一个二进制0.
我们留下01.25,它大于/等于1,所以我们加一个二进制1,然后减去1.
用整数,我们得零离开了,所以我们停下来.但是:
我们留下00.25,它小于0.5,所以我们添加一个二进制0.
我们留下00.25,它更大/等于0.25,所以我们添加一个二进制1,并减去0.25.
现在我们有零,所以我们停止(或者不,你可以继续,如果你想要永远计算零)
请注意,并非所有十进制的"简单"数字都会达到零停止点.0.1(十进制)转换为基数2,无限重复:0.0001100110011001100110011 ...但是,二进制中的所有"简单"数字总是很好地转换为基数10.
您也可以使用小数(2.5),无理(pi)或甚至虚数(2i)基数执行相同的过程,除非基数不能介于-1和1之间.
Ale*_*nze 11
2.000 10 = 2 +1 = 10.000 2
1.000 10 = 2 +0 = 01.000 2
0.500 10 = 2 -1 = 00.100 2
0.250 10 = 2 -2 = 00.010 2
0.125 10 = 2 -3 = 00.001 2