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

时间:2014-01-15 19:13:21

标签: math floating-point binary

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

2 个答案:

答案 0 :(得分:1)

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

有限数字可以用通用IEEE 754双精度格式表示,当且仅当它等于 M •2 e 时一些整数 M e 使得-2 53 < M < 2 53 和-1074≤ e ≤971。

对于单精度,-2 24 < M < 2 24 和-149≤ e ≤104。

这些值来自指定浮点格式的参数,例如分数和指数字段可用的位数以及指数偏差的数量。


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

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

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

答案 1 :(得分:0)

如果您有大整数运算,请将xxx.yyy重写为分数xxxyyy/10^n,其中n是分数部分yyy的长度(位数)。

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

  • 计算gcd(xxxyyy,10 ^ n),
  • reducedNumerator = XXXYYY / GCD(XXXYYY,10 ^ n)的
  • reducedDenominator = 10 ^ n / gcd(xxxyyy,10 ^ n)

如果reducedDenominator可以被5整除(余数为零)那么这个数字不能用二进制表示,否则它是,并且浮点数可以用[sign*integerSignificand*2^biasedExponent

的形式表示

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

让我们首先看一下分子绝对值,(我假设不是0)并提取

  • nh =最高位的等级设置为1,
  • nl =最低位的等级设置为1

nh+1-nl给出表示有效数字所需的位数(二进制数字),它必须低于极限
例如,在IEEE 754双精度中:nh+1-nl<=53nh-nl<53

现在让我们看一下分母,如果不能被5整除,它就是两个10 ... 0的幂,所以我们也可以重写可分性测试:取

  • dh =最高位的等级设置为1
  • dl =最低位的等级设置为1

如果dh不等于dl,则该数字不能用二进制表示 如果dh==dl,您必须nh-dh保持在特定范围内,还必须nl-dh

例如,IEEE 754双精度:-1074 <= nl-dhnh-dh <= 1023

如果您使用IEEE 754格式,那么有趣且更简单的是知道libc提供的转换函数atodatof或您的语言提供的等效函数是否会正确提升IEEE 754不精确标志,以及如何使用您的语言访问此标志...