Math 检查浮点数是否可完全转换为二进制

Math 检查浮点数是否可完全转换为二进制,math,floating-point,binary,Math,Floating Point,Binary,我知道如何将整数和浮点数转换成二进制。但有些浮点数没有精确的二进制格式。Like 0.5可以精确地写成0.1,0.25可以写成0.01。但是如何确定一个数字是否可以完全转换成二进制呢 要表示为二进制浮点格式,数字必须是2的幂的倍数,包括负幂。例如,.375是可表示的,它是1/8的倍数。(1/8是.125,而.375是它的三倍。)还有其他要求,因为数字的各个部分必须符合浮点格式: 当且仅当某些整数M和e等于M•2e且-253

我知道如何将整数和浮点数转换成二进制。但有些浮点数没有精确的二进制格式。Like 0.5可以精确地写成0.1,0.25可以写成0.01。但是如何确定一个数字是否可以完全转换成二进制呢

要表示为二进制浮点格式,数字必须是2的幂的倍数,包括负幂。例如,.375是可表示的,它是1/8的倍数。(1/8是.125,而.375是它的三倍。)还有其他要求,因为数字的各个部分必须符合浮点格式:

当且仅当某些整数M和e等于M•2e且-253 对于单精度,-224 这些值来自指定浮点格式的参数,例如分数和指数字段有多少位可用以及指数有多少偏差


以下是测试数字是否符合上述标准的方法

首先,如果数字有小数部分,尝试将数字乘以2,直到没有小数部分。如果乘以149(单精度)或1074(双精度),则该数字不可表示。如果数字没有小数部分,但为偶数,则将其除以2,直到其为奇数。在104(单精度)或971(双精度)分度后停止。完成乘法或除法后,请查看剩余数字的绝对值。如果大于或等于16777216(对于单精度)或9007199254740992(对于双精度),则该数字不可表示。否则,它就是


(提示:使用十进制数字执行乘法步骤时,如果分数部分以5以外的数字结尾,则该数字不可表示。例如,.4和.24不可表示。5、.25和.625不可表示,而.525不可表示。)

如果您有大整数算法可用,将
xxx.yyy
重写为分数
xxxyy/10^n
其中n是分数部分yyy的长度(位数)

将上述分数的分子和分母的十进制表示形式转换为二进制,然后减少分数:

  • 计算gcd(xxxyyy,10^n)
  • 还原分子=xxxyyy/gcd(xxxyyy,10^n)
  • 减速减速器=10^n/gcd(xxxyyy,10^n)
如果reducedDenominator可被5整除(余数为零),则数字不能用二进制表示,否则可以用二进制表示,浮点可以用符号*整数重要性和*2^biasedExponent的形式表示

但在大多数语言中,有效位的位数和指数的范围是有限的

让我们先看看分子的绝对值,(我假定不是0)然后提取

  • nh
    =最高位的秩设置为1
  • nl
    =最低位的秩设置为1
nh+1-nl
提供表示有效位所需的位数(二进制数字),它必须在限制范围内

例如,在IEEE 754双精度:
nh+1-nl中,您想知道人类是如何检查数字的,还是如何编写检查十进制数字的软件?