C++ 在二进制记数法中,小数点后的数字是什么意思&引用;?

C++ 在二进制记数法中,小数点后的数字是什么意思&引用;?,c++,c,floating-point,ieee-754,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 这对我来说很有意义,除了一段: 4

我有一个关于如何将基数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
这对我来说很有意义,除了一段:

45.25 (base 10) = 101101.01 (base 2)

45是二进制的101101,没关系。。但是他们是如何得到0.25 as.01的呢?

以2为基数的分数是.1=1/2,.01=1/4

2.00010=2+1=10.0002
1.00010=2+0=01.0002
0.50010=2-1=00.1002
0.25010=2-2=00.0102

0.12510=2-3=00.0012

简单位置值。在base 10中,您有以下位置:

。。。103 102 101 10010-110-210-3

。。。千,百,十,一。十分之一、百分之一、千分之一

类似地,在二进制(基数2)中,您有:

。。。23 22 21 202-12-2-3

。。。八,四,二,一。一半、四分之一、八分之一

因此,二进制中仅次于
的第二位是2-2的单位,大家都知道是1/4(或者0.25)的单位。

其他基数中的“小数”(分数位)令人惊讶地不直观,因为它们的工作方式与整数完全相同

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   
如果我们从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.000110011。。。然而,所有二进制的“简单”数字都会很好地转换成10进制


您也可以对分数(2.5)、无理(pi)或甚至虚(2i)基数执行相同的过程,但基数不能在-1和1之间(包括-1和1)。

您可以通过重复乘以新基数(在本例中,新基数为2)将小数点后的部分转换为另一个基数,如下所示:

0.25 * 2 = 0.5
->第一个二进制数字是0(取整数部分,即小数点之前的部分)

继续与小数点后的部分相乘:

0.5 * 2 = 1.0
->第二个二进制数字是1(同样,取整数部分)

这也是我们停止的地方,因为小数点后的部分现在是零,所以没有更多的乘法

因此,分数部分的最终二进制表示为:0.012

编辑:

可能还值得注意的是,二进制表示常常是无限的,即使是从基数为10的有限小数部分开始。示例:将0.210转换为二进制:

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 = ...
最后我们得到:0.001100110011…2

使用此方法,您很容易看到二进制表示是否最终是无限的。

这样想

(dot)2^-12^-2^-3等

所以

。0/2+1/4+0/8+0/16等


参见

您可以将0.25视为1/4

除以2英寸(以2为基数)将小数点向左移动一步,同样,除以10英寸(以10为基数)将小数点向左移动一步。通常,除以M in(基数M),小数点向左移动一步

所以


等等。

但是我们不能比较虚数,对吗?@Rotsor:我想我们可以,我只是不知道怎么做。Knuth发现了如何处理无理基:@Rotsor&Mooing Duck:Rotsor是正确的,因为数学不等式(,=)不是为复数定义的。解决此问题的一种方法是使用Knuth的四元虚基,因为复数可以在该虚基中的单个项中写入(示例7+4i(基数10)=10323(基数2i))。然而,以十进制为基数的比较并不总是产生与四元数相同的结果。例如:0>-4(基数10),而0<1000(基数2i)。(-4(以10为基数)=1000(以2i为基数))@nijoakim:很高兴知道数学不等式没有定义,“显而易见”的方式与有理数的比较不匹配。然而,我仍然相信可能存在一种有意义的方法。@MooingDuck:是的,我同意这是完全可能的。自从你发布这篇文章以来,我一直在试图找出其中一个,但结果很难。+1,尽管我觉得将二进制位置称为“八、四…”有点幽默,因为每个位置的值都不超过一个。@David,这是一个很好的观点。我一直在胡说该怎么做,但我用复数来匹配常见的十进制用法,希望能让解释更容易理解。
base 10                  base 2
--------------------------------------
1                      =>      1
1/2 = 0.5              =>    0.1
0.5/2 = 1/4 = 0.25     =>   0.01 
0.25/2 = 1/8 = 0.125   =>  0.001
.
.
.