<分区>
float a;
a=8.3;
if(a==8.3)
printf("1");
else
printf("2");
分别给出a为8.3和8.4,与8.3和8.4对应比较,输出为2,与8.5比较输出为1。我发现这与占用8个字节的循环二进制概念有关。我想知道如何找到哪个数字是循环二进制数。请提供一些意见。
<分区>
float a;
a=8.3;
if(a==8.3)
printf("1");
else
printf("2");
分别给出a为8.3和8.4,与8.3和8.4对应比较,输出为2,与8.5比较输出为1。我发现这与占用8个字节的循环二进制概念有关。我想知道如何找到哪个数字是循环二进制数。请提供一些意见。
最佳答案
循环数字不可表示,因此 float 比较不起作用。
float 学并不精确。像 0.2 这样的简单值不能用二进制 float 来精确表示,而且 float 的精度有限意味着运算顺序的微小变化都会改变结果。同样在第二条评论中 - 浮点文字 8.3
的类型为 double
并且 a
的类型为 float
。
与epsilon比较——绝对误差
由于浮点计算涉及一些不确定性,我们可以通过查看两个数字是否彼此“接近”来尝试考虑到这一点。如果您根据错误分析、测试或大胆猜测决定结果应始终在预期结果的 0.00001 以内,那么您可以将比较更改为:
if (fabs(result - expectedResult) < 0.00001)
例如,3/7
是一个重复的二进制小数,它的 double 计算值与单精度存储值不同。因此 3/7
与其存储的计算值的比较失败。
更多信息请阅读 - What Every Computer Scientist Should Know About Floating-Point Arithmetic
关于c - 十进制数的循环二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590885/