在哪里可以找到 Java 平方根函数的源代码? [关闭]

2023-12-11

我知道Math.sqrt来电StrictMath.sqrt(double a).

方法签名在StrictMath班级:

public static native double sqrt(double a);

我本来想看看实际的实现代码用于计算它。


当你安装JDK时,标准库的源代码可以在里面找到src.zip。这不会帮助你StrictMath,不过,作为StrictMath.sqrt(double)实现如下:

public static native double sqrt(double a);

所以它实际上只是一个本地调用,并且可能由 Java 在不同的平台上以不同的方式实现。

然而,正如文档StrictMath states:

为了帮助确保 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、hypot、expm1 和 log1p。

因此,通过找到合适的版本fdlibm源代码中,您还应该找到 Java 使用的确切实现(并且由此处的规范强制执行)。

使用的实现fdlibm is

static const double one = 1.0, tiny=1.0e-300;

double z;
int sign = (int) 0x80000000; 
unsigned r, t1, s1, ix1, q1;
int ix0, s0, q, m, t, i;

ix0 = __HI(x); /* high word of x */
ix1 = __LO(x); /* low word of x */

/* take care of Inf and NaN */
if ((ix0 & 0x7ff00000) == 0x7ff00000) {            
    return x*x+x; /* sqrt(NaN) = NaN, 
                     sqrt(+inf) = +inf,
                     sqrt(-inf) = sNaN */
} 

/* take care of zero */
if (ix0 <= 0) {
    if (((ix0&(~sign)) | ix1) == 0) {
        return x; /* sqrt(+-0) = +-0 */
    } else if (ix0 < 0) {
        return (x-x) / (x-x); /* sqrt(-ve) = sNaN */
    }
}

/* normalize x */
m = (ix0 >> 20);
if (m == 0) { /* subnormal x */
    while (ix0==0) {
        m -= 21;
        ix0 |= (ix1 >> 11); ix1 <<= 21;
    }
    for (i=0; (ix0&0x00100000)==0; i++) {
        ix0 <<= 1;
    }
    m -= i-1;
    ix0 |= (ix1 >> (32-i));
    ix1 <<= i;
}

m -= 1023; /* unbias exponent */
ix0 = (ix0&0x000fffff)|0x00100000;
if (m&1) { /* odd m, double x to make it even */
    ix0 += ix0 + ((ix1&sign) >> 31);
    ix1 += ix1;
}

m >>= 1; /* m = [m/2] */

/* generate sqrt(x) bit by bit */
ix0 += ix0 + ((ix1 & sign)>>31);
ix1 += ix1;
q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */
r = 0x00200000; /* r = moving bit from right to left */

while (r != 0) {
    t = s0 + r; 
    if (t <= ix0) { 
        s0 = t+r; 
        ix0 -= t; 
        q += r; 
    } 
    ix0 += ix0 + ((ix1&sign)>>31);
    ix1 += ix1;
    r>>=1;
}

r = sign;
while (r != 0) {
    t1 = s1+r; 
    t = s0;
    if ((t<ix0) || ((t == ix0) && (t1 <= ix1))) { 
        s1 = t1+r;
        if (((t1&sign) == sign) && (s1 & sign) == 0) {
            s0 += 1;
        }
        ix0 -= t;
        if (ix1 < t1) {
            ix0 -= 1;
        }
        ix1 -= t1;
        q1  += r;
    }
    ix0 += ix0 + ((ix1&sign) >> 31);
    ix1 += ix1;
    r >>= 1;
}

/* use floating add to find out rounding direction */
if((ix0 | ix1) != 0) {
    z = one - tiny; /* trigger inexact flag */
    if (z >= one) {
        z = one+tiny;
        if (q1 == (unsigned) 0xffffffff) { 
            q1=0; 
            q += 1;
        }
    } else if (z > one) {
        if (q1 == (unsigned) 0xfffffffe) {
            q+=1;
        }
        q1+=2; 
    } else
        q1 += (q1&1);
    }
}

ix0 = (q>>1) + 0x3fe00000;
ix1 =  q 1>> 1;
if ((q&1) == 1) ix1 |= sign;
ix0 += (m <<20);
__HI(z) = ix0;
__LO(z) = ix1;
return z;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在哪里可以找到 Java 平方根函数的源代码? [关闭] 的相关文章

随机推荐

  • 访问被拒绝 - PHP move_uploaded_file - Ubuntu LAMP /var/www

    我意识到我的权限存在某种问题tmp文件夹或images我在 var www 文件夹中创建的文件夹 我知道 var www 最初具有 root 访问权限 我一直在遵循一些在线教程来尝试解决此问题 并在过去一个小时左右的时间里将我的权限更改为
  • 多线程 C 程序中的线程 ID 错误?

    我是 C 多线程新手 我有这个问题 我写了以下代码 include
  • 如何使用 JavaScript 改变网页上的字母颜色?

    我正在尝试使用 javascript 更改网页上特定 div 中每个字母的颜色 我在论坛上发现了这个脚本 它使用表单选择来交替 div 单词的颜色
  • 具有 netTcpBinding 和证书传输安全性的 WCF

    我需要保护使用 netTcpBinding 并直接与基于 Windows 窗体的应用程序连接的 WCF 服务 我只需要它在传输层得到保护 我很确定我可以在本地运行该服务 即我可以在本地运行该服务 并与客户端连接到它 当我尝试设置服务以使其在
  • cURL 登录 HTTPS 站点

    我一直在尝试使用 cURL 和 PHP 将登录凭据发布到 https 站点 但没有成功 对于不安全的网站来说一切正常 但我无法通过 https 获得它 我知道我发布的标题详细信息是正确的 尽管我为了这个示例而模拟了它们 请帮忙
  • 如何将 SchemaExportTool 与 JPA 和 Hibernate 4.3 结合使用

    在 Hibernate 4 3 中 Ejb3Configuration 类被删除 此类通常用于从持久性单元 persistence xml 文件 到 SchemaExport 工具创建 hibernate 配置文件 作为将架构导出到 sql
  • 从简单的 FireBase 数据库读取

    我在读取 Firebase 数据库时遇到一些问题 我有一个非常简单的布局 lot lot1 low lot2 low lot3 low 当然 MyAppName 高于这一切 FirebaseDatabase database Firebas
  • 如何在一次查询中检索多个数据 Firebase

    我是 firebase 和 nosql 的新手 我遵循了数据结构化指南 这是我的数据的样子 Guardians jojo pti gros KBT2ui6wlC6Fgk1c7Xa creationDate 2016 02 26 15 50
  • 在 Linux 上使用 fgets() 读取带有 DOS 行结尾的文件

    我有一个在运行时收到的带有 DOS 行结尾的文件 因此我无法将行结尾转换为 UNIX 样式脱机 另外 我的应用程序可以在 Windows 和 Linux 上运行 我的应用程序做了一个fgets 文件并尝试逐行读取 Linux 上每行读取的字
  • Oracle 中的外键约束问题

    在 Oracle 9i 中声明 FK 时遇到问题 我在 SO 和一些在线文档中查看了许多示例 例如http www techonthenet com oracle foreign keys foreign delete php 没有任何真正
  • 如何找出ClearCase视图加载的文件在哪里?

    我们使用 ClearCase UCM 和 base 我们面临的悬而未决的问题之一是 如何通过给定的视图存储目录路径找出快照视图的加载文件所在的位置 例如我们的景观位于C views myview vws 有时 等效加载的文件位于C view
  • ZF2 + Doctrine2:服务器已消失 - 如何启动旧连接?

    在此先感谢您的帮助 我想知道是否有人很快知道在实体存储库死机时要调用哪些函数来重新连接 我正在通过 ZF2 CLI 路由运行一些作业 这些作业可能需要超过 wait timeout 的时间 不幸的是 ER 的连接在需要使用时 作业完成时 就
  • UILocalNotification重复声音

    我使用了此页面中苹果示例的代码 Link 但我似乎无法让声音重复 我检查了其他应用程序 例如 Skype 用于 VOIP 和 Alarm Clock Pro 音频 但我无法重复播放声音文件 这是我的代码 void applicationDi
  • Windll ctypes 从 python 2.7 调用可变参数 c 函数在 win64 中有效,但在 win32 中无效

    我在 Windows 10 32 和 Windows 10 64 上使用 Python 2 7 我正在为 C 编译的 stdcall Windows DLL mydll 编写一个 python 包装器 我有 2 个版本的 DLL 32 位和
  • 是否可以使 wget 的进度条适应多个文件?

    我通过执行或多或少的操作来下载某些目录的所有 htm 文件 wget http some url r accept htm nv show progress 其中我关闭了 wget 的打印 但保留了进度条 这对我的情况很有用 nv show
  • C++/CLI - 如何打开新表单并返回

    我正在创建一个应用程序 其中前端必须是使用 C CLI 的 Windows 窗体 该表格用于登录目的 在我的表单中 我有一个注册按钮 单击此按钮后 应打开一个新表单 关闭登录表单 我能够通过以下代码实现这一目标 Form rgForm gc
  • C++ 对命名空间中函数的未定义引用

    这已经困扰我一段时间了 我有一个命名空间 在该命名空间中我想声明 C 风格的函数 所以我做了我认为正确的事情 namespace test std deque
  • javaFX:MediaPlayer的seek方法挂起播放器,没有错误消息或状态更改

    我有一个带有 8 个媒体播放器的程序 它们像一个大视频一样通过一组控件进行控制 我有一个滑块来控制时间 也就是我调用所有 MediaPlayerseek中的方法onMouseReleased滑块的 我的问题是 媒体播放器一直挂起 没有改变其
  • JTable 的单元格渲染器 - 彩色行

    我一直在寻找解决方案 但在不问我自己的问题的情况下 我无法从各个地方了解如何让我的桌子进行彩色行 从我看过的每个地方我收集到我需要使用单元格渲染器 但问题是我不知道如何将其应用到我自己的情况 因此 我有一个包含 3 列的简单 JTable
  • 在哪里可以找到 Java 平方根函数的源代码? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我知道Math sqrt来电StrictMath sqrt double a 方法签名在StrictMath班级 public static nat