在Java中,我需要以独立于平台的方式计算(int)Math.exp(x).要实现平台无关性,我必须使用StrictMath:(int)StrictMath.exp(x).不幸的是,我的测量结果显示,StrictMath.expMath.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.expMath.exp具有相同的误差保证?只有StrictMath.exp%的保证才能让我进行上述优化.

推荐答案

所有这些信息的组合是否真的意味着StrictMath.expMath.exp具有相同的误差保证?

从表面上看,1的误差保证是相同的,即小于1 ulp.但这并不等于说错误是一样的!

使用StrictMath的目的并不是要保证误差是绝对最小的.相反,重点是保证reproducible个结果,独立于编程语言、硬件实现等.

另一方面,Math个方法(仍然是2)没有被指定来产生与它们的StrictMath个类似功能逐位相同的结果.正如Java 17中的javadoc所述:

"Unlike some of the numeric methods of class 100, all implementations of the equivalent functions of class 101 are not defined to return the bit-for-bit same results. This relaxation permits better-performing implementations 102."


然而,我还没有找到任何说明MathStrictMath相等的东西.

我不认为它们一定是等同的:在任何版本的Java中都不是.事实上,这将是以上contradict条javadoc的引述.


1-这是基于您在问题中引用的文本.
2-虽然Java 17和更高版本中的所有浮点算术运算都有strictfp个语义(参见JEP 306),但这不会自动扩展到Math.

Java相关问答推荐

Java -使用空比较或instanceof?

是否可以从@ TrustMapping中删除特定方法的基路径?

如何在Javascript中设置文本区域圆角的样式

为什么Java的代码工作(if condition内部的实例)

为什么在枚举中分支预测比函数调用快?

Bean定义不是从Spring ApplationConext.xml文件加载的

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

buildDir:File!&#的getter解决方案是什么?39.被抛弃

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

在打开搜索结果时,如何让Eclipse打开整个文件?

持续时间--为什么在秒为负数的情况下还要做额外的工作?

如何在Java中的重写方法参数中强制(Enum)接口实现?

Java递归泛型是否可以被视为继承和重写的语法糖

设置背景时缺少Android编辑文本下划线

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

Springboot应用程序无法识别任何@RestController或@Service,我认为@Repository也无法识别