/** This file is part of the MicroPython project, http://micropython.org/** These math functions are taken from newlib-nano-2, the newlib/libm/math* directory, available from https://github.com/32bitmicro/newlib-nano-2.** Appropriate copyright headers are reproduced below.*//* ef_sqrtf.c -- float version of e_sqrt.c.* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.*//** ====================================================* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.** Developed at SunPro, a Sun Microsystems, Inc. business.* Permission to use, copy, modify, and distribute this* software is freely granted, provided that this notice* is preserved.* ====================================================*/#include "fdlibm.h"#ifdef __STDC__static const float one = 1.0f, tiny=1.0e-30f;#elsestatic float one = 1.0f, tiny=1.0e-30f;#endif// sqrtf is exactly __ieee754_sqrtf when _IEEE_LIBM definedfloat sqrtf(float x)/*#ifdef __STDC__float __ieee754_sqrtf(float x)#elsefloat __ieee754_sqrtf(x)float x;#endif*/{float z;__uint32_t r,hx;__int32_t ix,s,q,m,t,i;GET_FLOAT_WORD(ix,x);hx = ix&0x7fffffff;/* take care of Inf and NaN */if(!FLT_UWORD_IS_FINITE(hx))return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+infsqrt(-inf)=sNaN *//* take care of zero and -ves */if(FLT_UWORD_IS_ZERO(hx)) return x;/* sqrt(+-0) = +-0 */if(ix<0) return (x-x)/(x-x); /* sqrt(-ve) = sNaN *//* normalize x */m = (ix>>23);if(FLT_UWORD_IS_SUBNORMAL(hx)) { /* subnormal x */for(i=0;(ix&0x00800000L)==0;i++) ix<<=1;m -= i-1;}m -= 127; /* unbias exponent */ix = (ix&0x007fffffL)|0x00800000L;if(m&1) /* odd m, double x to make it even */ix += ix;m >>= 1; /* m = [m/2] *//* generate sqrt(x) bit by bit */ix += ix;q = s = 0; /* q = sqrt(x) */r = 0x01000000L; /* r = moving bit from right to left */while(r!=0) {t = s+r;if(t<=ix) {s = t+r;ix -= t;q += r;}ix += ix;r>>=1;}/* use floating add to find out rounding direction */if(ix!=0) {z = one-tiny; /* trigger inexact flag */if (z>=one) {z = one+tiny;if (z>one)q += 2;elseq += (q&1);}}ix = (q>>1)+0x3f000000L;ix += (m <<23);SET_FLOAT_WORD(z,ix);return z;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。