在Java中,我需要以独立于平台的方式计算(int)Math.exp(x)
.要实现平台无关性,我必须使用StrictMath:(int)StrictMath.exp(x)
.不幸的是,我的测量结果显示,StrictMath.exp
比Math.exp
慢得多.
所以,我想先计算y = Math.exp(x)
.The interface of Math.exp
个国家表示,
计算结果必须在准确结果的1个ULP以内.结果一定是半单调的.
如果是(int)(Math.nextDown(y)) == (int)(Math.nextUp(y))
,我可以用(int)y
作为结果.只有在非常罕见的情况下,即(int)(StrictMath.nextDown(y)) != (int)(StrictMath.nextUp(y))
(结果预计将在int
范围内),我需要额外判断(int)StrictMath.exp(x)
.
如果StrictMath.exp
具有与Math.exp
相同的差错保证,则该策略将是正确的.
不幸的是,StrictMath.exp
interface中缺少相应的陈述.The javadoc of StrictMath只是说
为了帮助确保Java程序的可移植性,这个包中的一些数值函数的定义要求它们产生与某些已发布算法相同的结果.这些算法可从著名的网络库netlib中获得,其名称为"可自由分发的数学库"fdlibm.这些算法是用C编程语言编写的,然后被理解为以遵循Java浮点算术规则的所有浮点操作执行.
Java数学库是根据fdlibm版本5.3定义的.如果fdlibm为一个函数(如acos)提供了多个定义,请使用"IEEE 754核心函数"版本(位于名称以字母e开头的文件中).需要fdlibm语义的方法是sin、cos、tan、asin、acos、atan、exp、log、log10、cbrt、atan2、pow、sinh、Cosh、tanh、tent、expm1和log1p.
此外,exp function in the fdlibm library的界面上说,
精度:根据误差分析,误差始终小于1ULP(最后一位的单位).
所有这些信息的组合是否真的意味着StrictMath.exp
与Math.exp
具有相同的误差保证?只有StrictMath.exp
%的保证才能让我进行上述优化.