Back to index

glibc  2.9
Functions
e_hypotl.c File Reference
#include "math.h"
#include "math_private.h"

Go to the source code of this file.

Functions

long double __ieee754_hypotl (long double x, long double y)

Function Documentation

long double __ieee754_hypotl ( long double  x,
long double  y 
)

Definition at line 59 of file e_hypotl.c.

{
       long double a,b,t1,t2,y1,y2,w;
       u_int32_t j,k,ea,eb;

       GET_LDOUBLE_EXP(ea,x);
       ea &= 0x7fff;
       GET_LDOUBLE_EXP(eb,y);
       eb &= 0x7fff;
       if(eb > ea) {a=y;b=x;j=ea; ea=eb;eb=j;} else {a=x;b=y;}
       SET_LDOUBLE_EXP(a,ea);      /* a <- |a| */
       SET_LDOUBLE_EXP(b,eb);      /* b <- |b| */
       if((ea-eb)>0x46) {return a+b;} /* x/y > 2**70 */
       k=0;
       if(ea > 0x5f3f) {    /* a>2**8000 */
          if(ea == 0x7fff) {       /* Inf or NaN */
              u_int32_t exp,high,low;
              w = a+b;                    /* for sNaN */
              GET_LDOUBLE_WORDS(exp,high,low,a);
              if(((high&0x7fffffff)|low)==0) w = a;
              GET_LDOUBLE_WORDS(exp,high,low,b);
              if(((eb^0x7fff)|(high&0x7fffffff)|low)==0) w = b;
              return w;
          }
          /* scale a and b by 2**-9600 */
          ea -= 0x2580; eb -= 0x2580;     k += 9600;
          SET_LDOUBLE_EXP(a,ea);
          SET_LDOUBLE_EXP(b,eb);
       }
       if(eb < 0x20bf) {    /* b < 2**-8000 */
           if(eb == 0) {    /* subnormal b or 0 */
               u_int32_t exp,high,low;
              GET_LDOUBLE_WORDS(exp,high,low,b);
              if((high|low)==0) return a;
              SET_LDOUBLE_WORDS(t1, 0x7ffd, 0, 0);      /* t1=2^16382 */
              b *= t1;
              a *= t1;
              k -= 16382;
           } else {         /* scale a and b by 2^9600 */
               ea += 0x2580;       /* a *= 2^9600 */
              eb += 0x2580; /* b *= 2^9600 */
              k -= 9600;
              SET_LDOUBLE_EXP(a,ea);
              SET_LDOUBLE_EXP(b,eb);
           }
       }
    /* medium size a and b */
       w = a-b;
       if (w>b) {
           u_int32_t high;
           GET_LDOUBLE_MSW(high,a);
           SET_LDOUBLE_WORDS(t1,ea,high,0);
           t2 = a-t1;
           w  = __ieee754_sqrtl(t1*t1-(b*(-b)-t2*(a+t1)));
       } else {
           u_int32_t high;
           GET_LDOUBLE_MSW(high,b);
           a  = a+a;
           SET_LDOUBLE_WORDS(y1,eb,high,0);
           y2 = b - y1;
           GET_LDOUBLE_MSW(high,a);
           SET_LDOUBLE_WORDS(t1,ea+1,high,0);
           t2 = a - t1;
           w  = __ieee754_sqrtl(t1*y1-(w*(-w)-(t1*y2+t2*b)));
       }
       if(k!=0) {
           u_int32_t exp;
           t1 = 1.0;
           GET_LDOUBLE_EXP(exp,t1);
           SET_LDOUBLE_EXP(t1,exp+k);
           return t1*w;
       } else return w;
}

Here is the call graph for this function: