据我了解,C ++中的long double实际上利用了硬件架构(至少对于某些架构而言)。 Java中的BigDecimal是否为足够小的输入执行此操作?
答案 0 :(得分:5)
Java中的BigDecimal是否为足够小的输入执行此操作?
不,它不能。浮点数是有损的,而每个BigDecimal
都有一个相关的精度,并且可以精确地表示低于该精度的任何数字。没有足够小的输入"可以有用地呈现为浮点数,因为即使您碰巧具有可以用浮点表示法精确表示的BigDecimal
值,您也很难做任何类型的对该值进行操作并保持指定的精度。
换句话说,BigDecimal
的目的是在牺牲速度的同时提供精确度。这与浮点完全相反,浮点会牺牲精度而有利于速度。
听起来你好像在问Java是否提供了一种方法来处理long double
大小的浮点数和there is not。我们可以从以下事实得出结论:没有提供JDK作者从未认为有必要添加到该语言中。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
BigDecimal和典型硬件长双重支持之间最重要的区别是浮点基数。
BigDecimal的值是一个整数乘以10的幂。浮点硬件通常基于IEEE二进制浮点,每个值是一个整数乘以2的幂。
某些计算的输入在long double中可以准确表示,其结果会导致long double中的舍入误差大于使用给定比例的BigDecimal中的舍入误差。例如,1和10都可以用两种格式精确表示。将1除以10的结果可以在BigDecimal中精确表示,其中至少为1,但不是任何基数2格式。
当然,有许多理由无法用两种格式完全表示。考虑1/3。即使在那里,BigDecimal也会获得更大或更小的舍入误差,具体取决于比例。答案在long double和BigDecimal中不太可能完全相同。
对每个计算进行测试以确定两种格式是否得到相同的答案会破坏使用硬件辅助所带来的任何性能提升。