计算机使用二进制表达方式来存储任何数字类型,包括浮点数,并且一个浮点数做占据的二进制位数也是一定的,这就决定了浮点数的精度受到了一定的限制,会造成一些细微的误差。所以是不能通过浮点数与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误差范围内是相等的。这样就可以解决绝对误差的问题了。