如何比较perl中的浮点数以外的浮点数

时间:2014-02-11 22:08:55

标签: perl floating-point

我试图比较两个浮点数大于或等于,小于或等于。以下代码仅允许我测量相等性(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";
}

2 个答案:

答案 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