我试图比较两个浮点数大于或等于,小于或等于。以下代码仅允许我测量相等性(true或false)。我需要测量> =和< =。我意识到比较浮点数是任何语言的问题。我曾尝试查询以前有关此问题的问题。我所能找到的只是平等的比较。有什么建议吗?
#!/usr/bin/perl
my $a = 0.0;
my $b = 0.1;
if (abs($a - $b) < 0.0000001){
print "True\n";
}
else{
print "False\n";
}
答案 0 :(得分:4)
您要问的情况是,您有两个数字$a
和$b
,这些数字是您在尝试计算某些精确数学值时计算出的值 a 和 b 。但是,由于任何数值算术在计算中都有错误,因此值$a
和$b
包含的错误(可能)使它们与 a 和 b 。然后,仅提供$a
和$b
,您需要确定 a 和 b 之间的关系。
这里的规则是垃圾输入,垃圾输出。当您的数字包含错误时,您可以使用它们进行有限的操作。你无法完美地确定这种关系。
$a
与 a 有多大差异? $b
与 b 有多大差异?这个问题没有一般的答案。这取决于您为获取这些值所执行的计算以及涉及的数字。错误的范围可以从零到无穷大,或者可以为您提供非数字(NaN)结果。确定错误的大小是特定于应用程序的。如果没有关于您正在执行的计算的详细信息,则无法给出答案。
在您计算出可能存在多少错误之后,您会怎么做?错误数量会告诉您$a
和$b
中可能存在多少“污点”。如果$a
和$b
的差异超过了这一数量,那么您可以确定 a 和 b 肯定是不同的。但是,如果$a
和$b
在这个斜坡距离内,你能说什么呢?
无法确定。您无法知道 a 和 b 是否相等, a 是否更大,或 b 是否更大。那么在这种情况下你想要什么答案?
有一个神话,经常在Stack Overflow上重复,浮点数应该与公差进行比较。当计算值在容差范围内时,用这个神话给出的算法几乎总是显示报告为相等的数字。但没有理由应该是正确的答案。如果被告知两个数字相等则有些应用程序将会中断。
因此,无法确定正确答案时给出的答案取决于您的申请。
答案 1 :(得分:1)
if ($a > $b - tolerance) ... # $a >= $b
if ($a < $b + tolerance) ... # $a <= $b
编辑:说更安全
if ($a - $b > -tolerance) ... # $a >= $b
if ($a - $b < tolerance) ... # $a <= $b