之前看了一篇描述神奇sqrt函数的文章,因此很好奇java是怎么实现sqrt的。
然后闲的无聊跟踪了一下Math.sqrt的调用,发现
public static double sqrt(double a) {
return StrictMath.sqrt(a);
}
然后:
在StrictMath里
public static native double sqrt(double a);
说明sqrt是一个native的实现。
从StrictMath的类说明中可以得知,这是调用了一个
Freely Distributable Math Library fdlibm.tar
找了一下,在jdk/share/native/java/lang/fdlibm/中可以发现相应的H文件和.c文件
打开e_sqrt.c可以看懂sqrt函数的真正定义
原来是用最经典的迭代的方法计算的,显然要比John Carmack(雷神之锤的作者)所用的
magic numbe
r
0x5f3759df 的方法要慢不少。。。。。。。
顺便再来看看java是怎么把这个fdlibm弄进来的。
jdk文件夹下有很多 主要:java/jre/lib/amd64
其中libjava最可疑 (windows下貌似是java.dll?)
使用nm查看so文件 用grep看 sqrt所在位置
果然是它:
0000000000013a90 T Java_java_lang_StrictMath_IEEEremainder
00000000000139e0 T Java_java_lang_StrictMath_acos
00000000000139d0 T Java_java_lang_StrictMath_asin
00000000000139f0 T Java_java_lang_StrictMath_atan
0000000000013a70 T Java_java_lang_StrictMath_atan2
0000000000013a40 T Java_java_lang_StrictMath_cbrt
0000000000013a50 T Java_java_lang_StrictMath_ceil
00000000000139a0 T Java_java_lang_StrictMath_cos
0000000000013aa0 T Java_java_lang_StrictMath_cosh
0000000000013a00 T Java_java_lang_StrictMath_exp
0000000000013af0 T Java_java_lang_StrictMath_expm1
0000000000013a60 T Java_java_lang_StrictMath_floor
0000000000013ad0 T Java_java_lang_StrictMath_hypot
0000000000013a10 T Java_java_lang_StrictMath_log
0000000000013a20 T Java_java_lang_StrictMath_log10
0000000000013ae0 T Java_java_lang_StrictMath_log1p
0000000000013a80 T Java_java_lang_StrictMath_pow
00000000000139b0 T Java_java_lang_StrictMath_sin
0000000000013ab0 T Java_java_lang_StrictMath_sinh
0000000000013a30 T Java_java_lang_StrictMath_sqrt
00000000000139c0 T Java_java_lang_StrictMath_tan
0000000000013ac0 T Java_java_lang_StrictMath_tanh
然后在java.c中,可以发现
int
main(int argc, char ** argv)
int JNICALL
JavaMain(void * _args)
两个java的入口主函数,前者将jvm load入系统,后者则将需要的Native lib load入
相关的方法如 GetJREPath ,LocateJRE 和 LoadJavaVM等则在java_md.c中定义。
具体的流程还需要进一步研究.....
分享到:
相关推荐
使用JPL算法实现的fpga复数sqrt的近似运算,附件中有源代码和算法文献描述使用JPL算法实现的fpga复数sqrt的近似运算,附件中有源代码和算法文献描述
如何在标准库下实现pow与aqrt函数
可以使用sqrt函数进行计算和输出,程序简单,功能便捷
最小二乘法原理十分简单,这里不再赘述。对于预测公式y' = a * x + b,最优...double r = Sxy / Math.sqrt(Sxx * Syy);其中,r为相关系数,绝对值越大,线性相关性越大。对f(a b) = (y - y')^2求极值,即可得到上述解。
cordic 计算cos,sin,tan ,sqrt matlab 实现, 容易改成 c code
实现sqrt的七种算法.pdf
平方根函数sqrt(int x)(java代码).docx
关于sqrt3细分的英文论文,sqrt3细分的提出者所著的论文
判断素数(sqrt).cpp
简单的计算器java程序,初学者可以看看,希望能够对大家有帮助。
java课程设计,里面包含源程序和课程设计报告 题目要求:编写一计算器,仿照windows xp计算器界面,能实现基本的运算及一些科学运算。 能实现的运算如下: "+",加 "-",减 "*",乘 "/",除 "x^y",x的y次方 "Mod",取模 ...
一个简易的计算器,能实现加减乘除 ,sqrt ,1/x , %,删除的功能
本文实例讲述了go语言实现sqrt的方法。分享给大家供大家参考。具体实现方法如下: 代码如下:package mymath import “math” func InvSqrt(x float32) float32 { var xhalf float32 = 0.5*x // get bits for ...
q_sqrt的分析,看看吧就当休闲了,呵呵
一个Sqrt函数引发的血案-博文代码 博文地址:
c++ sqrt开方函数代码
结果由ATLAS对$$(sqrt {s} = 8 $$ s = 8且($$ | \ Delta \ eta |> 2 $$ |Δη|> 2)二面角角相关的测量给出。 包含Z玻色子的13 TeV pp碰撞。 使用LHC运行1和36.1 $中记录的$$ \ sqrt {s} = 8 $$ s = 8 TeV数据的...
2.实现了除 了 加 、 减 、 乘 、 除 、清零、删除按钮外其他按钮功能,如 正切( tan )、余弦( cos ),以及求平方根( sqrt )、指数( pow )、对 e 的指数( exp )、对数运算( log )的功能。 3.实现了连续...
java编写的计算器,能实现加减乘除。 //***该梦幻计算器与Windows附件自带计算器的标准版功能、界面相仿***// //******但还不支持键盘操作,如有需要,下一次等级将满足你**********// import java.awt.*; import ...
编程趣谈:一个Sqrt函数引发的血案参考.pdf