CHDK_DE Vorschauversion  Trunk Rev. 5218
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
ef_sqrt.c-Dateireferenz
#include "fdlibm.h"
+ Include-Abhängigkeitsdiagramm für ef_sqrt.c:

gehe zum Quellcode dieser Datei

Funktionen

float sqrtf (float x)
 

Variablen

static float one = 1.0
 
static float tiny =1.0e-30
 

Dokumentation der Funktionen

float sqrtf ( float  x)

Definiert in Zeile 24 der Datei ef_sqrt.c.

25 {
26  float z;
27  int sign = (int)0x80000000;
28  unsigned int r,hx;
29  int ix,s,q,m,t,i;
30 
31  GET_FLOAT_WORD(ix,x);
32  hx = ix&0x7fffffff;
33 
34  /* take care of Inf and NaN */
35  if(!FLT_UWORD_IS_FINITE(hx))
36  return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
37  sqrt(-inf)=sNaN */
38  /* take care of zero and -ves */
39  if(FLT_UWORD_IS_ZERO(hx)) return x;/* sqrt(+-0) = +-0 */
40  if(ix<0) return (x-x)/(x-x); /* sqrt(-ve) = sNaN */
41 
42  /* normalize x */
43  m = (ix>>23);
44  if(FLT_UWORD_IS_SUBNORMAL(hx)) { /* subnormal x */
45  for(i=0;(ix&0x00800000L)==0;i++) ix<<=1;
46  m -= i-1;
47  }
48  m -= 127; /* unbias exponent */
49  ix = (ix&0x007fffffL)|0x00800000L;
50  if(m&1) /* odd m, double x to make it even */
51  ix += ix;
52  m >>= 1; /* m = [m/2] */
53 
54  /* generate sqrt(x) bit by bit */
55  ix += ix;
56  q = s = 0; /* q = sqrt(x) */
57  r = 0x01000000L; /* r = moving bit from right to left */
58 
59  while(r!=0) {
60  t = s+r;
61  if(t<=ix) {
62  s = t+r;
63  ix -= t;
64  q += r;
65  }
66  ix += ix;
67  r>>=1;
68  }
69 
70  /* use floating add to find out rounding direction */
71  if(ix!=0) {
72  z = one-tiny; /* trigger inexact flag */
73  if (z>=one) {
74  z = one+tiny;
75  if (z>one)
76  q += 2;
77  else
78  q += (q&1);
79  }
80  }
81  ix = (q>>1)+0x3f000000L;
82  ix += (m <<23);
83  SET_FLOAT_WORD(z,ix);
84  return z;
85 }

Variablen-Dokumentation

float one = 1.0
static

Definiert in Zeile 21 der Datei ef_sqrt.c.

float tiny =1.0e-30
static

Definiert in Zeile 21 der Datei ef_sqrt.c.