c语言浮点数和0比较大小,C-浮点数为什么不能和0比较?

计算机使用二进制表达方式来存储任何数字类型,包括浮点数,并且一个浮点数做占据的二进制位数也是一定的,这就决定了浮点数的精度受到了一定的限制,会造成一些细微的误差。所以是不能通过浮点数与0比较来决定是否相等的,但是可以通过与一个阈值比较来确定是否相等。

说到这个阈值,就多说几句。其实这个阈值的选取也很麻烦,不能太大,也不能太小,而是要根据具体情况进行适当取值。例如,如果阈值取0.0001,本来足够小了吧?但是对于两个浮点数0.00002和0.00001来说就太大了。但是如果两个浮点数分别是100000和100001,那么阈值取0.1,甚至取1都是可以。这里就涉及到绝对阈值和相对阈值了。上述两个示例是绝对阈值的示例,显然,绝对阈值是无法满足任何情况的,那么最好的办法就是使用相对阈值。

相对阈值就是根据两个浮点数a和b的大小来决定阈值的大小,进而判断是否相等。具体代码如下:

#include

using namespace std;

bool equal(double x, double y)

{

if((x - y) / x < 0.00001)

return true;

return false;

}

int main()

{

cout << equal(3.141593, 3.141592) << endl << equal(3141593, 3141592);

return 0;

}

上述代码通过相对阈值来进行判断,无论是拥有6位小数的小浮点数,还是比较大的浮点数,得到的结果都是1,也就是0.00001误差范围内是相等的。这样就可以解决绝对误差的问题了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值