2

我作为顾问从事名为 Oracle RPAS 的产品,该应用程序是使用 C++ 开发的。在 Oracle RPAS 中,可以对定制开发的 Java 程序进行 JNI 调用以处理数据。存储在 Oracle RPAS for Real 中的数据始终是 Double(8 字节),Java 中也是如此。不幸的是,Oracle RPAS 使用硬编码值 0.0000000001 (1e-09) 作为 epsilon 来比较双精度数和其他计算,即使数据以双精度数存储在数据库中。在 Java 中,我无法找到将代码与这个硬编码值对齐的方法。我需要以类似的方式比较数据集。这些是数学运算,我主要需要执行 min(double x,double Y) , max(double x,double Y) round(double x*double Y)/ double Y) , ceil , floor 等。

我需要帮助了解 epsilon 在 Java 中的工作原理吗?用于开发的 Java 版本是 1.6

我不是 Java 专家,并且有一些编码经验,任何起点都将有助于解决这个问题。

4

2 回答 2

0

epsilon 的整个想法应该基于您的应用程序逻辑。如果您要处理希望在小数点后 3 位之前具有价值的数据,请使用像0.0001. 或者类似地,如果您知道您的应用程序将处理多达十亿(1,000,000,000)的数字,那么您知道 double 最多可以精确到小数点后 5-6 位(15 个有效数字减去小数点前的 10 个数字)。因此选择 0.000001 作为 epsilon 是合理的。

据我所知,Java 在双重比较期间不会进行任何内部 epsilon 处理。它需要明确地完成,就像在编写 C/C++ 时一样。

当然,您也可以考虑使用 BigDecimal 作为替代方案。但是,在进行 BigDecimal 算术时,您仍然需要定义要保持的精度,其推理类似于 epsilon for double。

于 2015-11-12T04:01:07.770 回答
-1

在 Java 中,您使用 BigDecimal 而不是 Double,然后您根本不需要使用任何 epsilon。

于 2015-11-12T03:21:40.697 回答