十进制数的重复二进制

时间:2013-10-25 13:14:03

标签: c binary

float a;
a=8.3;
if(a==8.3)
printf("1");
else
printf("2");

分别给出8.3和8.4,并相应地与8.3和8.4比较,输出变为2但是当与8.5输出相比时,我发现它与重复二进制的概念有关,它占用8个字节。我想知道如何找到重复二进制的数字。请提供一些意见。

3 个答案:

答案 0 :(得分:3)

重复数字不可表示,因此浮点数比较不起作用。

浮点数学并不准确。像0.2这样的简单值无法使用二进制浮点数精确表示,浮点数的有限精度意味着操作顺序的微小变化可能会改变结果。与第二条评论一样 - 浮点文字8.3的类型为doublea的类型为float

与epsilon比较 - 绝对错误

由于浮点计算涉及一些不确定性,我们可以尝试通过查看两个数字是否彼此“接近”来实现这一点。如果您根据错误分析,测试或疯狂猜测决定 - 结果应始终在预期结果的0.00001范围内,那么您可以将比较更改为:

if (fabs(result - expectedResult) < 0.00001)

例如,3/7是一个重复的二进制小数,它的双精度计算值与单精度的存储值不同。因此,比较3/7及其存储的计算值失败。

有关详情,请阅读 - What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:1)

您不应使用==比较浮点数是否相等。由于浮点数实际存储在内存中会产生不准确的结果。

使用类似的内容确定您的号码a是否足够接近所需的值:

if(fabs(a-8.3) < 0.0000005))

答案 2 :(得分:0)

这里有两个问题。

首先,像8.3这样的浮点文字的类型为double,而a的类型为float。双精度和浮点数将值存储到不同的精度,对于没有精确浮点表示的值(例如8.3),存储的值略有不同。因此,比较失败。

可以通过将比较写为a==8.3f来解决此问题; f后缀强制文字为float而不是double

然而,直接比较浮点值是不好的juju;同样,大多数值不能完全表示 ,而只能表示近似值。如果a是涉及多个浮点计算的表达式的结果,则它可能不等同于8.3f。理想情况下,你应该看看这两个值之间的差异,如果它低于某个阈值,那么它们实际上是等价的:

if ( fabs( a - 8.3f) < EPSILON ) 
{
   // a is "equal enough" to 8.3
}

EPSILON的确切值取决于许多因素,尤其是所比较的值的大小。您只有很多精度数字,因此如果您要比较的值大于999999.0,则无法测试0.000001之间的差异。