我知道如何将整数和浮点数转换为binay。但是一些浮点数没有精确的二进制格式。像0.5一样可以写成0.1和0.25可写为0.01。但是如何确定一个数字是否可以完全转换为二进制?
答案 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的长度(位数)。
将上述分数的分子和分母的十进制表示转换为二进制,然后减少分数:
如果reducedDenominator可以被5整除(余数为零)那么这个数字不能用二进制表示,否则它是,并且浮点数可以用[sign*integerSignificand*2^biasedExponent
但在大多数语言中,有效数的位数和指数范围都是有限的。
让我们首先看一下分子绝对值,(我假设不是0)并提取
nh
=最高位的等级设置为1,nl
=最低位的等级设置为1 nh+1-nl
给出表示有效数字所需的位数(二进制数字),它必须低于极限
例如,在IEEE 754双精度中:nh+1-nl<=53
或nh-nl<53
现在让我们看一下分母,如果不能被5整除,它就是两个10 ... 0的幂,所以我们也可以重写可分性测试:取
dh
=最高位的等级设置为1 dl
=最低位的等级设置为1 如果dh不等于dl,则该数字不能用二进制表示
如果dh==dl
,您必须nh-dh
保持在特定范围内,还必须nl-dh
。
例如,IEEE 754双精度:-1074 <= nl-dh
和nh-dh <= 1023
如果您使用IEEE 754格式,那么有趣且更简单的是知道libc提供的转换函数atod
或atof
或您的语言提供的等效函数是否会正确提升IEEE 754不精确标志,以及如何使用您的语言访问此标志...