⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ef_sqrt.c

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 C
字号:
/* 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.0, tiny = 1.0e-30;
#else
static float one = 1.0, tiny = 1.0e-30;
#endif

#ifdef __STDC__
float __ieee754_sqrtf(float x)
#else
float __ieee754_sqrtf(x)
		 float x;
#endif
{
	float   z;
	__int32_t sign = (__int32_t) 0x80000000;
	__uint32_t r;
	__int32_t ix, s, q, m, t, i;

	GET_FLOAT_WORD(ix, x);

	/* take care of Inf and NaN */
	if((ix & 0x7f800000L) == 0x7f800000L)
	{
		return x * x + x;						/* sqrt(NaN)=NaN, sqrt(+inf)=+inf
																   sqrt(-inf)=sNaN */
	}
	/* take care of zero */
	if(ix <= 0)
	{
		if((ix & (~sign)) == 0)
			return x;									/* sqrt(+-0) = +-0 */
		else if(ix < 0)
			return (x - x) / (x - x);	/* sqrt(-ve) = sNaN */
	}
	/* normalize x */
	m = (ix >> 23);
	if(m == 0)
	{															/* 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;
			else
				q += (q & 1);
		}
	}
	ix = (q >> 1) + 0x3f000000L;
	ix += (m << 23);
	SET_FLOAT_WORD(z, ix);
	return z;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -