相关疑难解决方法(0)

Java双重比较epsilon

我写了一个类来测试相等,小于和大于Java中的两个双重.我的一般情况是比较可以具有半分精度的价格.59.005比59.395.我选择的epsilon适合这些情况吗?

private final static double EPSILON = 0.00001;


/**
 * Returns true if two doubles are considered equal.  Tests if the absolute
 * difference between two doubles has a difference less then .00001.   This
 * should be fine when comparing prices, because prices have a precision of
 * .001.
 *
 * @param a double to compare.
 * @param b double to compare.
 * @return true true if two doubles are considered equal.
 */
public static boolean equals(double a, double b){ …
Run Code Online (Sandbox Code Playgroud)

java floating-point currency

40
推荐指数
5
解决办法
9万
查看次数

使用==运算符比较float/double值

当我开始使用相等运算符比较两个浮点值时,我使用的代码审查工具会引用以下内容.什么是正确的方法以及如何做到这一点?是否有一个帮助函数(commons-*),我可以重用它?

描述

无法使用equals(==)运算符比较浮点值

说明

通过使用等式(==)或不等式(!=)运算符来比较浮点值并不总是准确的,因为舍入错误.

建议

比较两个浮点值以查看它们是否接近值.

float a;
float b;

if(a==b)
{
..
}
Run Code Online (Sandbox Code Playgroud)

java floating-point

18
推荐指数
3
解决办法
3万
查看次数

机器epsilon的使用是否适合浮点相等测试?

这是测试浮点值相等性的后续行动:"精度"常量是否有标准名称?.对于平等,
有一个非常相似的问题Double.Epsilon,大于,小于,小于或等于,大于或等于.


众所周知,对两个浮点值x和y的相等测试应该看起来更像这样(而不是简单的=):

abs(x - y)< epsilon   ,其中epsilon是一个非常小的值.

如何为epsilon选择一个值?

显然最好选择epsilon尽可能小的值,以获得相等性检查的最高精度.

例如,.NET框架提供一个常量System.Double.Epsilon(= 4.94066×10 -324),表示System.Double大于零的最小正值.

但是,事实证明这个特定值不能可靠地用作epsilon,因为:

0 + System.Double.Epsilon≠0

1 + System.Double.Epsilon= 1(!)

也就是说,如果我理解正确,因为该常数小于机器epsilon.

→这是对的吗?

→这是否也意味着我可以可靠地使用epsilon:= machine epsilon进行相等测试?

删除了这两个问题,因为它们已经与上面提到的第二个SO问题得到了充分的回答.


链接到维基百科的文章说,对于64位浮点数(即double许多语言中的类型),机器epsilon等于:

2 -53,或约.0.000000000000000111(小数点后15个零的数字)

→是否遵循这一点,所有64位浮点值保证精确到14(如果不是15)数字?

language-agnostic floating-point precision epsilon

11
推荐指数
3
解决办法
3244
查看次数