2014-03-04 22 views
2

表达式的结果:2.227E-19-1.0+1.0将是0.0Java的极少数运算

我怎样才能获得2.227E-19的结果呢?

我有一个表达

a-b+1 

  • 一个永远是一个非常小的数。
  • B可能接近1.0

如何保持精度时,极少数有一个大数目操作?

+0

问题是什么?你得到什么? 'a'和'b'的值是什么? –

+0

'+(1.0-b)'。但这是一个假发:IEEE double有16位精度,所以'b'和1之间的最小变化大于'a'的大小 - 你基本上失去了所有的准确性。 –

回答

0

只需使用double即可存储结果。这个计算具有足够的精度。

+0

我不认为这是真的,即使使用双精度,使用给定值测试结果为0。 – benedek

0

如果你事先知道哪些操作数可以很小,你可以重新排序的操作:

-b + 1 + a 

这样,a之前的部分将被首先计算,双方(-b+1a)将大致大小相同,导致浮点问题更少。

这里是The Java™ Tutorials相关的部分:在同一行

运算符具有相同的优先级。当相同优先级的运算符出现在同一表达式中时,必须遵守一条规则,该规则首先被评估。除赋值运算符外的所有二元运算符都从左到右进行求值;

+0

以上产量更精确,但精度更高。 –

+0

我不确定你的意思是什么;至少在'b = 1'的情况下,这种方法保持'a'不被抵消,这是主要问题,据我所知。 – benedek

+0

如果以更高的精度计算'b'确实是'1 - 1.0E-17',那么总体结果将与2.227E-19完全不同。重新排列顺序以产生明显更精确的结果不会产生更准确的结果。 –

0

或者使用足够大的BigDecimal。