在哪里可以找到Java平方根函数的源代码?
我知道那个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
状态文档:
为了帮助确保Java程序的可移植性,此软件包中某些数字函数的定义要求它们产生与某些已发布算法相同的结果。这些算法可从著名的网络库fdlibm中获取netlib,该软件包为“自由分发的数学库”软件包。这些用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
是
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;
以上是 在哪里可以找到Java平方根函数的源代码? 的全部内容, 来源链接: utcz.com/qa/412707.html