php 浮动窗口,PHP-浮动数字精度

8b51762c9976b682e12044714919de2f.png

偶然的你

浮点数和所有数字一样,必须以0和1的字符串形式存储在内存中。浮点与整数的区别在于,当我们想要看它们时,我们如何解释0和1。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换句话说,000000100101100000000000000000以浮点数计算为27(按照IEEE-754标准)。然而,对于许多数字,没有精确的二进制表示。就像1/3=0.333.永远重复,1/100是0.00001010001110101110000.重复“10100011110101110000”。然而,32位计算机不能用浮点数存储整个数字.所以它做出了最好的猜测。0.0000001010001111010111000010100011110101110000Sign    Power           Mantissa

 +        -7     1.01000111101011100001010

 0    -00000111   01000111101011100001010

 0     11111001   0100011110101110000101001111100101000111101011100001010(请注意,负数7是使用2的补语产生的)应该立即清楚,0111110010100011110111110101010101010看起来一点也不像0.01。然而,更重要的是,这包含重复十进制的截断版本。最初的十进制包含一个重复的“10100011110101110000”。我们将其简化为01000111101010100001010通过我们的公式将这个浮点数转换回小数点,我们得到0.0099999979(注意,这是一台32位计算机。一台64位的计算机会有更高的精确度)十进制等价如果它有助于更好地理解这个问题,那么在处理重复的小数时,让我们看看十进制科学表示法。假设我们有10个“盒子”来存储数字。因此,如果我们想存储一个像1/16这样的数字,我们会写:+---+---+---+---+---+---+---+---+---+---+| + | 6 | . | 2 | 5 | 0 | 0 | e | - | 2 |+---+---+---+---+---+---+---+---+---+---+这显然是公正的6.25 e -2,在哪里e是缩写*10^(..我们为十进制分配了4个框,尽管我们只需要2(填充0),我们为符号分配了2个框(一个用于数字的符号,一个是指数的符号)。使用这样的10个框,我们可以显示从-9.9999 e -9到+9.9999 e +9这对于小数点4位或更少的任何东西都很好,但是当我们试图存储一个数字时,会发生什么呢?2/3?+---+---+---+---+---+---+---+---+---+---+| + | 6 | . | 6 | 6 | 6 | 7 | e | - | 1 |+---+---+---+---+---+---+---+---+---+---+这个新号码0.66667不完全等于2/3..事实上,这是0.000003333.....如果我们试着写0.66667在3号基地,我们可以0.2000000000012...而不是0.2如果我们取一个重复小数点较大的东西,这个问题可能会变得更明显,例如1/7..这有6个重复数字:0.142857142857...将其存储到我们的十进制计算机中,我们只能显示其中的5个数字:+---+---+---+---+---+---+---+---+---+---+| + | 1 | . | 4 | 2 | 8 | 6 | e | - | 1 |+---+---+---+---+---+---+---+---+---+---+这个号码,0.14286,已经过去了.000002857...它“接近正确”,但它不是完全正确,因此,如果我们试图把这个数字写在基数7中,我们就会得到一些可怕的数字,而不是0.1..实际上,将其插入WolframAlpha中,我们得到:.10000022320335...这些微小的小数差异对您来说应该很熟悉。0.0099999979(相对于0.01)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值