使用“<=”或“>=”来比较浮点数是否理想?
Is it ideal to use "<=" or ">=" to compare floating point numbers?
我知道我不应该使用 ==
或 !=
来比较浮点数,但我应该使用其他比较运算符如 <
或 <=
来比较浮点数吗?比较一下?
对于浮动,您可以使用 PHP 的 bcmath
扩展名:
For arbitrary precision mathematics PHP offers the Binary Calculator which supports numbers of any size and precision up to 2147483647 (or 0x7FFFFFFF) decimals, if there is sufficient memory, represented as strings.
特别是,bccomp()
有两个参数。 returns 如果它们相等则为 0,如果第一个参数更大则为 1,如果第二个参数更大则为 -1。第三个参数表示您要查找的小数位数精度。
bcmath('12.555437830', '12.555437829', 10);
// returns 1
请注意此函数的一个缺点是参数被视为字符串,尽管 PHP 的松散类型 通常 使这不是问题。
比较浮点数是否相等通常会出现问题的原因是浮点运算仅近似于实数运算。因此,如果我们有两个数字 x
和 y
是用浮点运算计算的,评估 x == y
通常不会告诉我们这两个数字是否 用精确数学计算的 x 和 y 是相等的。换句话说,询问是否 x == y
并不能肯定地给出我们想要的答案(除非我们为此目的仔细设计和分析了代码)。
<
等关系运算符也存在同样的问题。如果我们有 x
和 y
,其中一个或两个都不同于理想计算的 x 或 y少量,则 x < y
可能为真,而 x < y 为假,反之亦然。
这个问题没有通用的解决方案。在某些应用程序中,错误可能是可以容忍的。在某些应用程序中,可以推导出浮点误差 e 的界限,这样我们就可以证明,比方说,如果 x < y-e
为真,那么 x < y 为真。 (但是,如果 x < y-e
为假,我们不确定 x < y。)因此,适当的解决方案取决于具体应用。
我知道我不应该使用 ==
或 !=
来比较浮点数,但我应该使用其他比较运算符如 <
或 <=
来比较浮点数吗?比较一下?
对于浮动,您可以使用 PHP 的 bcmath
扩展名:
For arbitrary precision mathematics PHP offers the Binary Calculator which supports numbers of any size and precision up to 2147483647 (or 0x7FFFFFFF) decimals, if there is sufficient memory, represented as strings.
特别是,bccomp()
有两个参数。 returns 如果它们相等则为 0,如果第一个参数更大则为 1,如果第二个参数更大则为 -1。第三个参数表示您要查找的小数位数精度。
bcmath('12.555437830', '12.555437829', 10);
// returns 1
请注意此函数的一个缺点是参数被视为字符串,尽管 PHP 的松散类型 通常 使这不是问题。
比较浮点数是否相等通常会出现问题的原因是浮点运算仅近似于实数运算。因此,如果我们有两个数字 x
和 y
是用浮点运算计算的,评估 x == y
通常不会告诉我们这两个数字是否 用精确数学计算的 x 和 y 是相等的。换句话说,询问是否 x == y
并不能肯定地给出我们想要的答案(除非我们为此目的仔细设计和分析了代码)。
<
等关系运算符也存在同样的问题。如果我们有 x
和 y
,其中一个或两个都不同于理想计算的 x 或 y少量,则 x < y
可能为真,而 x < y 为假,反之亦然。
这个问题没有通用的解决方案。在某些应用程序中,错误可能是可以容忍的。在某些应用程序中,可以推导出浮点误差 e 的界限,这样我们就可以证明,比方说,如果 x < y-e
为真,那么 x < y 为真。 (但是,如果 x < y-e
为假,我们不确定 x < y。)因此,适当的解决方案取决于具体应用。