表达式的结果:2.227E-19-1.0+1.0
将是0.0Java的极少数运算
我怎样才能获得2.227E-19的结果呢?
我有一个表达
a-b+1
和
- 一个永远是一个非常小的数。
- B可能接近1.0
如何保持精度时,极少数有一个大数目操作?
表达式的结果:2.227E-19-1.0+1.0
将是0.0Java的极少数运算
我怎样才能获得2.227E-19的结果呢?
我有一个表达
a-b+1
和
如何保持精度时,极少数有一个大数目操作?
如果你事先知道哪些操作数可以很小,你可以重新排序的操作:
-b + 1 + a
这样,a
之前的部分将被首先计算,双方(-b+1
和a
)将大致大小相同,导致浮点问题更少。
这里是The Java™ Tutorials相关的部分:在同一行
运算符具有相同的优先级。当相同优先级的运算符出现在同一表达式中时,必须遵守一条规则,该规则首先被评估。除赋值运算符外的所有二元运算符都从左到右进行求值;
以上产量更精确,但精度更高。 –
我不确定你的意思是什么;至少在'b = 1'的情况下,这种方法保持'a'不被抵消,这是主要问题,据我所知。 – benedek
如果以更高的精度计算'b'确实是'1 - 1.0E-17',那么总体结果将与2.227E-19完全不同。重新排列顺序以产生明显更精确的结果不会产生更准确的结果。 –
或者使用足够大的BigDecimal。
问题是什么?你得到什么? 'a'和'b'的值是什么? –
'+(1.0-b)'。但这是一个假发:IEEE double有16位精度,所以'b'和1之间的最小变化大于'a'的大小 - 你基本上失去了所有的准确性。 –