当前位置: 首页 > 面试题库 >

为什么Math.sin()委托给StrictMath.sin()?

夏奕
2023-03-14
问题内容

我想知道,当我在Reddit线程中发现问题时,为什么要Math.sin(double)委托给。提到的代码片段如下所示(JDK
7u25):StrictMath.sin(double)

Math.java

public static double sin(double a) {
    return StrictMath.sin(a); // default impl. delegates to StrictMath
}

StrictMath.java

public static native double sin(double a);

第二项声明native对我来说是合理的。Math状态文档指出:

鼓励代码生成器使用特定于平台的本机库或微处理器指令(如果可用)(…)

问题是
:实现StrictMath平台特定的本机库不够吗?除了已安装的JRE,JIT还可以了解有关平台的更多信息(请仅关注这种情况)?换句话说,为什么还不是Math.sin()本地人?


问题答案:

我将尝试在单个帖子中总结整个讨论。

通常,的Math代表StrictMath。显然,可以内联该调用,因此这不是性能问题。

StrictMath是具有native本机库支持的方法的最终类。有人可能会认为, native意味着optimum
,但这不一定是事实。查看StrictMathjavadoc可以阅读以下内容:

(…)此程序包中某些数字函数的定义要求它们产生与某些已发布算法相同的结果。这些算法可以从著名的网络库netlib中以软件包“ Freely
Distributable Math Library”
fdlibm的形式获得。这些用C编程语言编写的算法,应理解为遵循Java浮点算术规则并通过所有浮点运算执行。

我对本文档的理解是,本机库实现StrictMath是根据 fdlibm
库实现的,该库是多平台的,已知会产生可预测的结果。由于它是多平台的,因此不能指望它是每个平台上的最佳实现, 我相信这是智能JIT可以
例如通过输入范围的统计分析和调整算法来 微调实际性能的地方。 /实现。

深入研究实现,很快发现,本机库备份StrictMath实际上 使用 fdlibm

OpenJDK
7中的StrictMath.c源代码如下所示:

   #include "fdlibm.h"
   ...
   JNIEXPORT jdouble JNICALL
   Java_java_lang_StrictMath_sin(JNIEnv *env, jclass unused, jdouble d)
   {
       return (jdouble) jsin((double)d);
   }

正弦函数在fdlibm / src /
s_sin.c中定义,在几个地方引用了__kernel_sin直接来自标头
fdlibm.h的函数

当我暂时 接受自己的答案时 ,很高兴能收到一个更称职 的答案



 类似资料:
  • 如果我在浏览器控制台输入这个表达式(带有严重的口音): 它将返回: 但是如果我输入这个表达式(带单引号): Math.sin'1' 它将返回错误: 你能解释一下为什么会这样吗?

  • 问题内容: 谁能用JavaScript解释事件委托,它有什么用? 问题答案: DOM事件委派是一种机制,它通过事件“冒泡”(也称为事件传播)的魔术,通过单个公共父节点而不是每个子节点来响应ui事件。 在元素上触发事件时,将发生以下情况: 事件被调度到其目标,并且在该目标中 找到的所有事件侦听器都会被触发。 然后,冒泡事件将触发所有其他事件侦听器,这些事件侦听器可通过向上跟随父链来查找在每个连续上注

  • 本文向大家介绍C#中的委托是什么?事件是不是一种委托?相关面试题,主要包含被问及C#中的委托是什么?事件是不是一种委托?时的应答技巧和注意事项,需要的朋友参考一下 答: 委托是将一种方法作为参数代入到另一种方法。 是,事件是一种特殊的委托。 //比如:onclick事件中的参数就是一种方法。

  • 本文向大家介绍C#中的委托是什么?事件是不是一种委托?事件和委托的关系。相关面试题,主要包含被问及C#中的委托是什么?事件是不是一种委托?事件和委托的关系。时的应答技巧和注意事项,需要的朋友参考一下 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的指针。 委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实

  • 问题内容: 我查看了Android中SensorManager的源代码,发现当您将侦听器的passs控制注册到时,就会发现。 我仅以此为例。我阅读了有关委托编程的Wikipedia文章,但仍不确定其目的。为什么要使用“委托”?它如何帮助控制程序?使用(或不使用)一个的缺点是什么?与听众一起使用最实用吗? 编辑:在第487行,有问题的方法在第1054行附近。 问题答案: 在GoF书中,委托并不完全是

  • 主要内容:类委托,属性委托,标准委托,可观察属性 Observable,把属性储存在映射中,Not Null,局部委托属性,属性委托要求,翻译规则,提供委托委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口