代码之家  ›  专栏  ›  技术社区  ›  Christian Vincenzo Traina

在IEEE 754标准中,数字除以100安全吗?

  •  2
  • Christian Vincenzo Traina  · 技术社区  · 5 年前

    在存储库代码中,在另一个团队开发的模块中,我发现有一个价格从美分到欧元的转换,只需将数字除以100。

    IEEE 754 标准。

    我知道将货币值作为浮点数处理是不安全的,但在将任务发送给另一个团队之前,我想知道这种情况是否安全。

    到目前为止,我还没有发现整数除以100得到不准确结果的情况。让我们更进一步: 100 只是 2*2*5*5

    我们知道用一个数除以 2 是安全的,因为它等于一个位置的移动。

    因此,我们可以很容易地说,如果存在一个不可被5整除的数字,那么除以100是不准确的。

    那么,在IEEE 754标准中,将一个数字除以100是安全的吗?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Maxim Egorushkin    5 年前

    精度为15位有效数字的浮点十进制数转换为64位二进制浮点数( Number see https://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/ 详细情况。

    当除以100时,二进制结果仍有64位精度,可能以最小精度(manitissa的最低位)为单位出现错误,除非结果低于0(请参见 What Every Computer Scientist Should Know About Floating-Point Arithmetic

    换言之,如果小数位数不超过15个有效数字,那么将它们除以100将保持该精度。

    E、 g.尝试 123456789012345 / 100 0.000123456789012345 / 100

    123456789012345 / 100
    1234567890123.45
    
    0.000123456789012345 / 100
    0.00000123456789012345
    
        2
  •  0
  •   Eric Postpischil    5 年前

    如果 是一个15位十进制整数,然后转换 到JavaScript Number

    笔记:

    • /100英镑。分区的实际结果,而它在 格式,一般不会完全正确
    • 将除法结果转换为 更多 超过15位有效的十进制数字通常也不会产生 /对于另一个进程,它必须使用15个有效的十进制数字(或其他一些错误缓解措施)来完成。
    • 下面的证明适用于15位整数 ,而不是其他15个有效的十进制数字(例如15个十进制数字后跟一个或多个零的数字,或以小数点后跟一些零后跟15个有效数字开头的数字)。

    JavaScript是ECMAScript的一个实现,在 Ecma-262 数字

    IEEE-754基本64位二进制浮点格式使用53位有效位。

    二进制浮点数的最小精度单位(ULP)是指赋予其有效位中最低有效位位置的值。(因此,具有指数的ULP标度)在ULP中测量,所有正常的53位有效位都在[2]中 ULP,2号 53个

    对于一个15位有效数字十进制数,这里的ULP是属于15位的值

    外稃

    首先,我们建立了一个众所周知的事实:将15位有效的十进制数字转换为 如果数字在 数字

    如果 是浮点格式(2)正常范围内的15位有效小数(不一定是整数 ¤ | 1024个 ),然后转换 精确到以浮点格式表示的最接近的值,然后将结果转换为15位有效的十进制数字 ,当两个转换都以舍入到最接近的方式执行时,将与偶数绑定。看这个,让 是的 是第一次转换的结果。如果 不同于 ,然后 是最接近的15位有效数字 是的 因此必须是第二次转换的结果。

    在第一次转换中,结果 是的 最多是来自 ,由于舍入规则。相对精度不超过/2 52个 是的 二分之一以上 . 最坏的情况是 可能是999999999999=10 15个 所以相对于ULP的误差 会是(10 15个 53个 ,约为0.111倍 . 因此, 是的 小于它的ULP,所以转换 返回到15位有效小数 .

    证明

    是一个15位十进制整数,它在 格式,因为 数字 格式在其有效位中有53位,因此能够精确地表示不超过2的所有整数 ,约为9.007e15,大于10 15个 .

    数字 准确地产生 没有错误。

    然后,根据四舍五入运算结果的规则 由100产生最接近 /100英镑。叫这个 是的 /100是一个可以用15个有效小数表示的数字。(它可以用科学符号写成 2个 或者在源代码中作为 后缀为 e-2 /100至 数字 是的 ,因为转换产生,就像除法一样,在 数字 最接近的格式 /100英镑。根据引理,转换的结果 /100至 数字 回到15位有效的十进制数字 /100,所以转换的结果 ,然后除以100,然后转换为15个有效的十进制数字也会产生

    推荐文章