source: trunk/libs/newlib/src/newlib/libm/mathfp/ef_hypot.c @ 503

Last change on this file since 503 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.1 KB
Line 
1/* ef_hypot.c -- float version of e_hypot.c.
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 */
4
5/*
6 * ====================================================
7 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8 *
9 * Developed at SunPro, a Sun Microsystems, Inc. business.
10 * Permission to use, copy, modify, and distribute this
11 * software is freely granted, provided that this notice
12 * is preserved.
13 * ====================================================
14 */
15
16#include "fdlibm.h"
17
18#ifdef __STDC__
19        float hypotf(float x, float y)
20#else
21        float hypotf(x,y)
22        float x, y;
23#endif
24{
25        float a=x,b=y,t1,t2,y1,y2,w;
26        __int32_t j,k,ha,hb;
27
28        GET_FLOAT_WORD(ha,x);
29        ha &= 0x7fffffffL;
30        GET_FLOAT_WORD(hb,y);
31        hb &= 0x7fffffffL;
32        if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
33        SET_FLOAT_WORD(a,ha);   /* a <- |a| */
34        SET_FLOAT_WORD(b,hb);   /* b <- |b| */
35        if((ha-hb)>0xf000000L) {return a+b;} /* x/y > 2**30 */
36        k=0;
37        if(ha > 0x58800000L) {  /* a>2**50 */
38           if(ha >= 0x7f800000L) {      /* Inf or NaN */
39               w = a+b;                 /* for sNaN */
40               if(ha == 0x7f800000L) w = a;
41               if(hb == 0x7f800000L) w = b;
42               return w;
43           }
44           /* scale a and b by 2**-60 */
45           ha -= 0x5d800000L; hb -= 0x5d800000L;        k += 60;
46           SET_FLOAT_WORD(a,ha);
47           SET_FLOAT_WORD(b,hb);
48        }
49        if(hb < 0x26800000L) {  /* b < 2**-50 */
50            if(hb <= 0x007fffffL) {     /* subnormal b or 0 */ 
51                if(hb==0) return a;
52                SET_FLOAT_WORD(t1,0x3f000000L); /* t1=2^126 */
53                b *= t1;
54                a *= t1;
55                k -= 126;
56            } else {            /* scale a and b by 2^60 */
57                ha += 0x5d800000;       /* a *= 2^60 */
58                hb += 0x5d800000;       /* b *= 2^60 */
59                k -= 60;
60                SET_FLOAT_WORD(a,ha);
61                SET_FLOAT_WORD(b,hb);
62            }
63        }
64    /* medium size a and b */
65        w = a-b;
66        if (w>b) {
67            SET_FLOAT_WORD(t1,ha&0xfffff000L);
68            t2 = a-t1;
69            w  = sqrtf(t1*t1-(b*(-b)-t2*(a+t1)));
70        } else {
71            a  = a+a;
72            SET_FLOAT_WORD(y1,hb&0xfffff000L);
73            y2 = b - y1;
74            SET_FLOAT_WORD(t1,ha+0x00800000L);
75            t2 = a - t1;
76            w  = sqrtf(t1*y1-(w*(-w)-(t1*y2+t2*b)));
77        }
78        if(k!=0) {
79            SET_FLOAT_WORD(t1,0x3f800000L+(k<<23));
80            return t1*w;
81        } else return w;
82}
Note: See TracBrowser for help on using the repository browser.