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个字节。我想知道如何找到重复二进制的数字。请提供一些意见。
答案 0 :(得分:3)
重复数字不可表示,因此浮点数比较不起作用。
浮点数学并不准确。像0.2这样的简单值无法使用二进制浮点数精确表示,浮点数的有限精度意味着操作顺序的微小变化可能会改变结果。与第二条评论一样 - 浮点文字8.3
的类型为double
,a
的类型为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之间的差异。