c - 十进制数的循环二进制

标签 c binary

<分区>

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/

相关文章:

具有某些性质的第k个二进制数的查找算法

c - 这两个二进制逻辑表达式是否相等?

c - 从输入插入数组中的元素 [核心转储(段错误)]

c - 有没有比使用 sscanf 更好的方法来实现这个结果?

累积平均绩点计算器 C 书写

python - 获取两个(二进制)数字之间不同的位数

c - 在 C 中的 Windows 上中断 Sleep()

c - 可以在 C 中返回和释放动态分配的数组吗?

MATLAB:将 uint32(4 字节)值转换为相应的 IEEE 单精度浮点形式

c++ - 如何在C++中输出变量的二进制值