OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [native/] [fdlibm/] [s_cbrt.c] - Blame information for rev 774

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 774 jeremybenn
 
2
/* @(#)s_cbrt.c 1.3 95/01/18 */
3
/*
4
 * ====================================================
5
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6
 *
7
 * Developed at SunSoft, a Sun Microsystems, Inc. business.
8
 * Permission to use, copy, modify, and distribute this
9
 * software is freely granted, provided that this notice
10
 * is preserved.
11
 * ====================================================
12
 *
13
 */
14
 
15
#include "fdlibm.h"
16
 
17
#ifndef _DOUBLE_IS_32BITS
18
 
19
/* cbrt(x)
20
 * Return cube root of x
21
 */
22
#ifdef __STDC__
23
static const uint32_t
24
#else
25
static uint32_t
26
#endif
27
        B1 = 715094163, /* B1 = (682-0.03306235651)*2**20 */
28
        B2 = 696219795; /* B2 = (664-0.03306235651)*2**20 */
29
 
30
#ifdef __STDC__
31
static const double
32
#else
33
static double
34
#endif
35
C =  5.42857142857142815906e-01, /* 19/35     = 0x3FE15F15, 0xF15F15F1 */
36
D = -7.05306122448979611050e-01, /* -864/1225 = 0xBFE691DE, 0x2532C834 */
37
E =  1.41428571428571436819e+00, /* 99/70     = 0x3FF6A0EA, 0x0EA0EA0F */
38
F =  1.60714285714285720630e+00, /* 45/28     = 0x3FF9B6DB, 0x6DB6DB6E */
39
G =  3.57142857142857150787e-01; /* 5/14      = 0x3FD6DB6D, 0xB6DB6DB7 */
40
 
41
#ifdef __STDC__
42
        double cbrt(double x)
43
#else
44
        double cbrt(x)
45
        double x;
46
#endif
47
{
48
        int32_t hx, lx, ht;
49
        double r,s,t=0.0,w;
50
        uint32_t sign;
51
 
52
 
53
        GET_HIGH_WORD(hx,x); /* high word of x */
54
        sign=hx&0x80000000;             /* sign= sign(x) */
55
        hx  ^=sign;
56
        if(hx>=0x7ff00000) return(x+x); /* cbrt(NaN,INF) is itself */
57
        GET_LOW_WORD(lx, x);
58
        if((hx|lx)==0)
59
            return(x);          /* cbrt(0) is itself */
60
 
61
        SET_HIGH_WORD(x,hx); /* x <- |x| */
62
    /* rough cbrt to 5 bits */
63
        if(hx<0x00100000)               /* subnormal number */
64
          {
65
            SET_HIGH_WORD(t,0x43500000);                /* set t= 2**54 */
66
            t*=x;
67
            GET_HIGH_WORD(ht,t);
68
            SET_HIGH_WORD(t,ht/3+B2);
69
          }
70
        else
71
          SET_HIGH_WORD(t,hx/3+B1);
72
 
73
 
74
    /* new cbrt to 23 bits, may be implemented in single precision */
75
        r=t*t/x;
76
        s=C+r*t;
77
        t*=G+F/(s+E+D/s);
78
 
79
    /* chopped to 20 bits and make it larger than cbrt(x) */
80
        SET_LOW_WORD(t,0);
81
        GET_HIGH_WORD(ht,t);
82
        SET_HIGH_WORD(t,ht + 0x00000001);
83
 
84
    /* one step newton iteration to 53 bits with error less than 0.667 ulps */
85
        s=t*t;          /* t*t is exact */
86
        r=x/s;
87
        w=t+t;
88
        r=(r-t)/(w+r);  /* r-s is exact */
89
        t=t+t*r;
90
 
91
    /* retore the sign bit */
92
        GET_HIGH_WORD(ht,t);
93
        SET_HIGH_WORD(t,ht|sign);
94
        return(t);
95
}
96
#endif /* _DOUBLE_IS_32BITS */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.