php写32位浮点数,PHP - 浮点数精度

与所有数字一样,浮点数必须作为0和1的字符串存储在内存中。 它是计算机的所有部分。 浮点与整数的不同之处在于我们在想要查看它们时如何解释0和1。

一位是“符号”(0 =正,1 =负),8位是指数(范围从-128到+127),23位是称为“尾数”(分数)的数字。 因此(S1)(P8)(M23)的二进制表示具有值(-1 ^ S)M * 2 ^ P.

“尾数”采用特殊形式。 在正常的科学记数法中,我们显示“一个地方”以及分数。 例如:

4.39 x 10 ^ 2 = 439

在二进制中,“一个地方”是一个比特。 由于我们忽略科学记数法中所有最左边的0(我们忽略任何无关紧要的数字),因此第一位保证为1

1.101 x 2 ^ 3 = 1101 = 13

由于我们保证第一位将为1,因此在存储数字时我们会删除此位以节省空间。 所以上面的数字只存储为101(尾数)。 假设前导1

举个例子,我们来看二进制字符串

00000010010110000000000000000000

打破它的组成部分:

Sign Power Mantissa

0 00000100 10110000000000000000000

+ +4 1.1011

+ +4 1 + .5 + .125 + .0625

+ +4 1.6875

运用我们简单的公式:

(-1^S)M*2^P

(-1^0)(1.6875)*2^(+4)

(1)(1.6875)*(16)

27

换句话说,00000010010110000000000000000000浮点数为27(根据IEEE-754标准)。

然而,对于许多数字,没有确切的二进制表示。 很像1/3 = 0.333 ....永远重复,1/100是0.00000010100011110101110000 .....重复“10100011110101110000”。 但是,32位计算机无法以浮点存储整个数字。 所以这是最好的猜测。

0.0000001010001111010111000010100011110101110000

Sign Power Mantissa

+ -7 1.01000111101011100001010

0 -00000111 01000111101011100001010

0 11111001 01000111101011100001010

01111100101000111101011100001010

(注意负7是使用2的补码产生的)

应该立即明确,01111100101000111101011100001010看起来不像0.01

但更重要的是,它包含重复小数的截断版本。 原始十进制包含重复的“10100011110101110000”。 我们已将其简化为01000111101011100001010

通过我们的公式将此浮点数转换回十进制,我们得到0.0099999979(请注意,这是针对32位计算机.64位计算机将具有更高的准确性)

十进制等价

如果它有助于更好地理解问题,那么在处理重复小数时,让我们看一下十进制科学记数法。

我们假设我们有10个“盒子”来存储数字。 因此,如果我们想要存储像1/16这样的数字,我们会写:

+---+---+---+---+---+---+---+---+---+---+

| + | 6 | . | 2 | 5 | 0 | 0 | e | - | 2 |

+---+---+---+---+---+---+---+---+---+---+

这显然只是0.0099999979,其中0.01是0.000003333...的简写。我们已经为小数分配了4个方框,即使我们只需要2个(用零填充),我们已分配2个方框用于标记(一个用于标记的符号) 数字,指数的标志之一)

使用此类10个方框,我们可以显示2347320300411585536至0.01等数字

这适用于4位或更少小数位的任何东西,但是当我们尝试存储像0.0099999979这样的数字时会发生什么?

+---+---+---+---+---+---+---+---+---+---+

| + | 6 | . | 6 | 6 | 6 | 7 | e | - | 1 |

+---+---+---+---+---+---+---+---+---+---+

这个新的号码0.0099999979并不完全相等0.01.事实上,它关闭了0.000003333....如果我们尝试在3的基础上写0.66667,我们得到0.0099999979而不是0.2

如果我们采取更大的重复小数,如0.0099999979,这个问题可能会变得更加明显。这有6个重复的数字:0.01

将其存储到我们的十进制计算机中,我们只能显示其中的5个数字:

+---+---+---+---+---+---+---+---+---+---+

| + | 1 | . | 4 | 2 | 8 | 6 | e | - | 1 |

+---+---+---+---+---+---+---+---+---+---+

这个数字,0.0099999979,由0.01关闭

这是“接近正确”,但它并不完全正确,所以如果我们试图在基数7中写这个数字,我们会得到一些可怕的数字,而不是0.0099999979.事实上,将其插入Wolfram Alpha我们得到:0.0099999979

您的0.0099999979(与0.01相对)应该看起来很小的分数差异

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值