java 平方根在哪个_在哪里可以找到Java平方根函数的源代码?

小编典典

安装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

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;

2020-10-26

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值