函数并使用逻辑非操作符

1
2
3
4
5
6
#include <cmath> // for fabs()
bool isAlmostEqual(double a, double b, double epsilon)
{
    // if the distance between a and b is less than epsilon, then a and b are "close enough"
    return fabs(a - b) <= epsilon;
}

图书馆返回形参的绝对值函数。晶圆厂(A - B)为一个正数回报A和B之间的距离。这个函数检查a和b之间的距离是否小于代表“足够接近”的ε值。如果A和B足够接近,函数返回true。


虽然这起作用,但并不伟大。一个0.00001的ε对1左右的输入是好的,对于0.0000001左右的数字来说太大了,对于像10000这样的数字来说太小了。这意味着每次调用这个函数时,我们必须选择一个适合我们输入的ε。如果我们知道我们必须按照我们的输入比例进行ε,我们也可以修改函数来为我们做这些。

#include <cmath>
 
// return true if the difference between a and b is within epsilon percent of the larger of a and b
bool approximatelyEqual(double a, double b, double epsilon)
{
    return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

在这种情况下,我们不使用ε作为绝对数,而是用ε作为乘子,所以它的效应与我们的输入有关。


让我们更详细研究如何approximatelyequal()功能。在操作符的左边,a的绝对值告诉我们a和b之间的距离为正数。在操作符的右边,我们需要计算我们愿意接受的“足够接近”的最大值。为了做到这一点,该算法选择A和B的较大(作为数字整体大小的粗略指示符),然后乘以ε。在这个函数中,ε表示百分数。例如,如果我们想说“足够接近”意味着A和B在A和B的较大的1%以内,我们传递一个ε1%(1%=1/100=0.01)。ε的值可以调整到任何最适合情况的(例如0.01%=ε0.0001)。做不等式(!=)而不是相等,只需调用这个函数并使用逻辑非操作符(!)翻转结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值