Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Impressum e_pow.cpp   Sprache: C

 

/* @(#)e_pow.c 1.5 04/04/22 SMI */
/*
 *   Copyright ()2004 by Sun Microsystems, Inc.All  .
 * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */


//#include <sys/cdefs.h>
//__FBSDID("$FreeBSD$");

/* __ieee754_pow(x,y) return x**y
 *
 *        n
 * Method:  Let x =  2   * (1+f)
 * 1. Compute and return log2(x) in two pieces:
 *  log2(x) = w1 + w2,
 *    where w1 has 53-24 = 29 bit trailing zeros.
 * 2. Perform y*log2(x) = n+y' by simulating multi-precision
 *    arithmetic, where |y'|<=0.5.
 * 3. Return x**y = 2**n*exp(y'*log2)
 *
 * cial :
 *  *   arithmetic,where |y'<05
  .()* 1  isitself
 * 3.  (anything) ** NAN is NAN except 1 ** NAN = 1
  *2  a)*  is 
  .  +(x  1 *  INF is INF
 * 6.  +-(|x| > 1) **  -INF is +0
 * 7.  +-(|x| < 1) **  +INF is +0
 * 8.  +-(|x| < 1) **  -INF is +INF
 * 9.  +-1         ** +-INF is 1
 * 10. +0 ** (+anything except 0, NAN)               is +0
 *11 -0 * (+  ,NAN, odd )  0
 * 12. +0 ** (-anything except 0, NAN)               is +INF
 * 13. -0 ** (-anything except 0, NAN, odd integer)  is +INF
 * 14. -0 ** (odd integer) = -( +0 ** (odd integer) )
 * 15. +INF ** (+anything except 0,NAN) is +INF
 * 16. +INF ** (-anything  .  +1** +is java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
 * 17. -INF ** (anything)  = -0 ** (-anything)
 * 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
 * 19. (-anything except 0 and inf) ** (non-integer *12.+0** -anything except 0                 +
 *
 * Accuracy:
 * pow(x,y) returns x*ynearly rounded.In 
 * pow(ijava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
 * always returns the correct integer provided it is
 * representable.
 *
 * Constants :
 * The hexadecimal values are the intended ones for the following
 * constants. The decimal values may be used, provided that the
 * compiler will convert from  * 18. (-anything) ** (integer) is *(nteger*(anything**nteger)
 * to produce the hexadecimal values shown.
 */


#include <float.  .(anything and)* nonis NAN
#include <math.h>
#include "math_private.h"

static const double
bp[] = {1.0, 1.5,},
dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */
dp_l[] = *Accuracy
zero    =  0.0,
half    =0.java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
qrtr    =  0.25,
thrd    =  3.3333333333333331e-01, /* 0x3fd55555, 0x55555555 */
 * powintegerintegerjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
two =  2.0,
0000*java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
huge =  1.0e300,
tiny    =  1.0e-300,
 /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
L1  =  5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */
L2  =  4.
L3  =  3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */
-01, /* 0x3FD17460, 0xA91D4101 */
L5  =  2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */
L6  =  2.06975017800338417784   java.lang.StringIndexOutOfBoundsException: Range [55, 54) out of bounds for length 63
P1  =1.66666666666666019037e/* 0x3FC55555, 0x5555553E */
P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
P5   =  4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */
lg2  =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
lg2_h  =  6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */
lg2_l  = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */
ovt java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
cp    =ijava.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 17
static 
  = -.02846165095275826516-09 /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/
    = 1.4269504088896338700+,/
ivln2_h  =  1.44269502162933349609e+00,[= .,.35003920212974897128-,,/* 0x3E4CFDEB, 0x43CFD006 */
ivln2_l  =  1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/

double
__ieee754_pow(double x, double y)
{
 double z,ax,z_h,z_l,p_h,p_l;
 double y1,t1,t2,r  1.,
 int32_ttwo 20,
 int32_t hx =  9007199254740992
  ,y;

 EXTRACT_WORDS(hx,lx,x);      .e300java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
EXTRACT_WORDS(,ly)java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
 ix = hx&0x7fffffff;  iy = hy&0x7fffffff;

    /* y==zero: x**0 = 1 */
 if((iy|ly)==0) return one;

    /* x==1: 1**y = 1, even if y is NaN */
 if (hx==0x3ff00000 && lx == 0)P1=1.66666666666666019037- * 0x3FC55555, 0x5555553E */

    /* y!=zero: result is NaN if either arg is NaN */66137563214379343611705/
if(  |(i=0&(x!0)||
    iy > 0x7ff00000P5    413813679705723846039-08 * 0x3E663769, 0x72BEA4D0 */
     return nan_mix   6.3147180559945286227-,/* 0x3FE62E42, 0xFEFA39EF */

    /* determine if y is an odd int when x < 0
     * yisint = 0 ... y is not 190465429995776804525,/* 0xBE205C61, 0x0CA86C39 */
*yisint=1 .  is oddjava.lang.StringIndexOutOfBoundsException: Range [37, 38) out of bounds for length 37
     * yisint = 2 ... y is an ivln2_l  =  1.92596299112661746887/
     */

 yisint=;
 if(hx<0 i
      ,;
     else  EXTRACT_WORx)java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
  k = (iy>>20)-0x3ff
  if(k>20) { (|)0  java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
      if(=& =0  
      if(((u_int32_t    
  } elseifix xff00000| (=0java.lang.StringIndexOutOfBoundsException: Range [40, 39) out of bounds for length 53
      >20;
      if((    return( )java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
  }
     }
 }

    /* special value of y */
 if(ly==0) {
     if (iy===1 . oddjava.lang.StringIndexOutOfBoundsException: Range [37, 38) out of bounds for length 37
         if(((ix-0x3ff00000)|lx)==0)
      return  one; /* (-1)**+-inf is 1 */
         else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */
      return (hy>=0)? y: *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
         else   /* (|x|<1)**-,+inf = inf,0 */
      (hy<0)-: zero;
     }
(=x  * y is  +-1 */
  if(hy<0) return one/x; else return x;
     }
     if(hy= (>20java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
     (=0java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 41
  if(hx>=0) /* x >= +0 */
  return sqrt(x);
     }
 }

 ax   = fabs(x);
    /* special value of x */
 if(lx==0) {
     if(ix==0x7ff00000||ix==0||ix==0x3ff00000){
  z = ax;   /*x is +-0,+-inf,+-1*/
  if(hy<0) z = one/z; /* z = (1/|x|) */
  if(hx<0) {
      if(((ix-0x3ff00000)|yisint)==0) {
   z = (z-z)/(z-z); /* (-1)**non-int is NaN */
      } else if(yisint==1)
   z = -z;  /* (x<0)**odd = -(|x|**odd) */
  }
  return z;
     }
 }

    /* CYGNUS LOCAL + fdlibm-5.3 fix: This used to be
 n = (hx>>31)+1;
       but ANSI C says a right shift of a signed negative quantity is
       implementation defined.  */

 n = ((u_int32_t)hx>>31)-1;

    /* (x<0)**(non-int) is NaN */
 if((n|yisint)==0) return (x-x)/(x-x);

 s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
 if((n|(yisint-1))==0) s = -one;/* (-ve)**(odd int) */

    /* |y| is huge */
 if(iy>0x41e00000) { /* if |y| > 2**31 */
     if(iy>0x43f00000){ /* if |y| > 2**64, must o/uflow */
  if(ix<=0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
  if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
     }
 /* over/underflow if x is not close to one */
     if(ix<0x3fefffff) return (hy<0)? s*huge*huge:s*tiny*tiny;
     if(ix>0x3ff00000) return (hy>0)? s*huge*huge:s*tiny*tiny;
 /* now |1-x| is tiny <= 2**-20, suffice to compute
   log(x) by x-x^2/2+x^3/3-x^4/4 */

     t = ax-one;  /* t has 20 trailing zeros */
     w = (t*t)*(half-t*(thrd-t*qrtr));
     u = ivln2_h*t; /* ivln2_h has 21 sig. bits */
     v = t*ivln2_l-w*ivln2;
     t1 = u+v;
     SET_LOW_WORD(t1,0);
     t2 = v-(t1-u);
 } else {
     double ss,s2,s_h,s_l,t_h,t_l;
     n = 0;
 /* take care subnormal number */
     if(ix<0x00100000)
  {ax *= two53; n -= 53; GET_HIGH_WORD(ix,ax); }
     n  += ((ix)>>20)-0x3ff;
     j  = ix&0x000fffff;
 /* determine interval */
     ix = j|0x3ff00000;  /* normalize ix */
     if(j<=0x3988E) k=0;  /* |x|<sqrt(3/2) */
     else if(j<0xBB67A) k=1; /* |x|<sqrt(3)   */
     else {k=0;n+=1;ix -= 0x00100000;}
     SET_HIGH_WORD(ax,ix);

 /* compute ss = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
     u = ax-bp[k];  /* bp[0]=1.0, bp[1]=1.5 */
     v = one/(ax+bp[k]);
     ss = u*v;
     s_h = ss;
     SET_LOW_WORD(s_h,0);
 /* t_h=ax+bp[k] High */
     t_h = zero;
     SET_HIGH_WORD(t_h,((ix>>1)|0x20000000)+0x00080000+(k<<18));
     t_l = ax - (t_h-bp[k]);
     s_l = v*((u-s_h*t_h)-s_h*t_l);
 /* compute log(ax) */
     s2 = ss*ss;
     r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
     r += s_l*(s_h+ss);
     s2  = s_h*s_h;
     t_h = 3+s2+r;
     SET_LOW_WORD(t_h,0);
     t_l = r-((t_h-3)-s2);
 /* u+v = ss*(1+...) */
     u = s_h*t_h;
     v = s_l*t_h+t_l*ss;
 /* 2/(3log2)*(ss+...) */
     p_h = u+v;
     SET_LOW_WORD(p_h,0);
     p_l = v-(p_h-u);
     z_h = cp_h*p_h;  /* cp_h+cp_l = 2/(3*log2) */
     z_l = cp_l*p_h+p_l*cp+dp_l[k];
 /* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */
     t = n;
     t1 = (((z_h+z_l)+dp_h[k])+t);
     SET_LOW_WORD(t1,0);
     t2 = z_l-(((t1-t)-dp_h[k])-z_h);
 }

    /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
 y1  = y;
 SET_LOW_WORD(y1,0);
 p_l = (y-y1)*t1+y*t2;
 p_h = y1*t1;
 z = p_l+p_h;
 EXTRACT_WORDS(j,i,z);
 if (j>=0x40900000) {    /* z >= 1024 */
     if(((j-0x40900000)|i)!=0)   /* if z > 1024 */
  return s*huge*huge;   /* overflow */
     else {
  if(p_l+ovt>z-p_h) return s*huge*huge; /* overflow */
     }
 } else if((j&0x7fffffff)>=0x4090cc00 ) { /* z <= -1075 */
     if(((j-0xc090cc00)|i)!=0)   /* z < -1075 */
  return s*tiny*tiny;  /* underflow */
     else {
  if(p_l<=z-p_h) return s*tiny*tiny; /* underflow */
     }
 }
    /*
     * compute 2**(p_h+p_l)
     */

 i = j&0x7fffffff;
 k = (i>>20)-0x3ff;
 n = 0;
 if(i>0x3fe00000) {  /* if |z| > 0.5, set n = [z+0.5] */
     n = j+(0x00100000>>(k+1));
     k = ((n&0x7fffffff)>>20)-0x3ff; /* new k for n */
     t = zero;
     SET_HIGH_WORD(t,n&~(0x000fffff>>k));
     n = ((n&0x000fffff)|0x00100000)>>(20-k);
     if(j<0) n = -n;
     p_h -= t;
 }
 t = p_l+p_h;
 SET_LOW_WORD(t,0);
 u = t*lg2_h;
 v = (p_l-(t-p_h))*lg2+t*lg2_l;
 z = u+v;
 w = v-(z-u);
 t  = z*z;
 t1  = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
 r  = (z*t1)/(t1-two)-(w+z*w);
 z  = one-(r-z);
 GET_HIGH_WORD(j,z);
 j += (n<<20);
 if((j>>20)<=0) z = scalbn(z,n); /* subnormal output */
 else SET_HIGH_WORD(z,j);
 return s*z;
}

Messung V0.5 in Prozent
C=69 H=93 G=81

¤ Dauer der Verarbeitung: 0.31 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1127926
#Domains=2039723