4

据我了解,C++ 中的 long double 实际上利用了硬件架构(至少对于某些架构而言)。Java 中的 BigDecimal 是否对足够小的输入执行此操作?

4

3 回答 3

5

Java 中的 BigDecimal 是否对足够小的输入执行此操作?

不,它不能。浮点数是有损的,而 eachBigDecimal具有相关的精度,并且可以精确地表示低于该精度的任何数字。没有“足够小的输入”可以有效地呈现为浮点数,因为即使你碰巧有一个BigDecimal可以用浮点表示法精确表示的值,你也很难做任何排序对该值的操作并保持指定的精度。

换句话说,目的BigDecimal在牺牲速度的同时提供精度。这与浮点完全相反,浮点牺牲了精度来换取速度。


听起来您在问 Java 是否提供了一种处理long double大小浮点数的方法,而没有. 我们可以从以下事实得出结论:JDK 作者从未认为有必要添加到该语言中。

于 2016-08-23T20:26:40.260 回答
1

不。BigDecimal 不利用任何硬件架构。例如,参见 Java Source Code 中 BigDecimal 的构造函数。

BigDecimal(BigInteger intVal, long val, int scale, int prec) {
    this.scale = scale;
    this.precision = prec;
    this.intCompact = val;
    this.intVal = intVal;
}
于 2016-08-23T20:17:26.293 回答
1

BigDecimal 和典型的硬件 long double 支持之间最重要的区别是浮点基数。

BigDecimal 的值是一个整数乘以十的幂。浮点硬件通常基于 IEEE 二进制浮点,每个值都是整数乘以 2 的幂。

某些输入在 long double 中完全可表示的计算,其结果在 long double 中产生的舍入误差比 BigDecimal 中给定的比例更大。例如,1 和 10 都可以用两种格式精确表示。1 除以 10 的结果可以用 BigDecimal 精确表示,比例至少为 1,但不能以任何 radix 2 格式表示。

当然,有许多有理数不能以任何一种格式精确表示。考虑 1/3。即使在那里,BigDecimal 也会根据规模获得或多或少的舍入误差。在 long double 和 BigDecimal 中,答案不太可能完全相同。

对每个计算进行测试以确定两种格式是否得到相同的答案会破坏使用硬件辅助带来的任何性能提升。

于 2016-08-24T11:25:46.793 回答