13a8617a8SJordan K. Hubbard /* s_cbrtf.c -- float version of s_cbrt.c. 23a8617a8SJordan K. Hubbard * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 33a8617a8SJordan K. Hubbard */ 43a8617a8SJordan K. Hubbard 53a8617a8SJordan K. Hubbard /* 63a8617a8SJordan K. Hubbard * ==================================================== 73a8617a8SJordan K. Hubbard * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 83a8617a8SJordan K. Hubbard * 93a8617a8SJordan K. Hubbard * Developed at SunPro, a Sun Microsystems, Inc. business. 103a8617a8SJordan K. Hubbard * Permission to use, copy, modify, and distribute this 113a8617a8SJordan K. Hubbard * software is freely granted, provided that this notice 123a8617a8SJordan K. Hubbard * is preserved. 133a8617a8SJordan K. Hubbard * ==================================================== 143a8617a8SJordan K. Hubbard */ 153a8617a8SJordan K. Hubbard 163a8617a8SJordan K. Hubbard #ifndef lint 173a8617a8SJordan K. Hubbard static char rcsid[] = "$Id: s_cbrtf.c,v 1.2 1994/08/18 23:06:27 jtc Exp $"; 183a8617a8SJordan K. Hubbard #endif 193a8617a8SJordan K. Hubbard 203a8617a8SJordan K. Hubbard #include "math.h" 213a8617a8SJordan K. Hubbard #include "math_private.h" 223a8617a8SJordan K. Hubbard 233a8617a8SJordan K. Hubbard /* cbrtf(x) 243a8617a8SJordan K. Hubbard * Return cube root of x 253a8617a8SJordan K. Hubbard */ 263a8617a8SJordan K. Hubbard #ifdef __STDC__ 273a8617a8SJordan K. Hubbard static const unsigned 283a8617a8SJordan K. Hubbard #else 293a8617a8SJordan K. Hubbard static unsigned 303a8617a8SJordan K. Hubbard #endif 313a8617a8SJordan K. Hubbard B1 = 709958130, /* B1 = (84+2/3-0.03306235651)*2**23 */ 323a8617a8SJordan K. Hubbard B2 = 642849266; /* B2 = (76+2/3-0.03306235651)*2**23 */ 333a8617a8SJordan K. Hubbard 343a8617a8SJordan K. Hubbard #ifdef __STDC__ 353a8617a8SJordan K. Hubbard static const float 363a8617a8SJordan K. Hubbard #else 373a8617a8SJordan K. Hubbard static float 383a8617a8SJordan K. Hubbard #endif 393a8617a8SJordan K. Hubbard C = 5.4285717010e-01, /* 19/35 = 0x3f0af8b0 */ 403a8617a8SJordan K. Hubbard D = -7.0530611277e-01, /* -864/1225 = 0xbf348ef1 */ 413a8617a8SJordan K. Hubbard E = 1.4142856598e+00, /* 99/70 = 0x3fb50750 */ 423a8617a8SJordan K. Hubbard F = 1.6071428061e+00, /* 45/28 = 0x3fcdb6db */ 433a8617a8SJordan K. Hubbard G = 3.5714286566e-01; /* 5/14 = 0x3eb6db6e */ 443a8617a8SJordan K. Hubbard 453a8617a8SJordan K. Hubbard #ifdef __STDC__ 463a8617a8SJordan K. Hubbard float cbrtf(float x) 473a8617a8SJordan K. Hubbard #else 483a8617a8SJordan K. Hubbard float cbrtf(x) 493a8617a8SJordan K. Hubbard float x; 503a8617a8SJordan K. Hubbard #endif 513a8617a8SJordan K. Hubbard { 523a8617a8SJordan K. Hubbard float r,s,t; 533a8617a8SJordan K. Hubbard int32_t hx; 543a8617a8SJordan K. Hubbard u_int32_t sign; 553a8617a8SJordan K. Hubbard u_int32_t high; 563a8617a8SJordan K. Hubbard 573a8617a8SJordan K. Hubbard GET_FLOAT_WORD(hx,x); 583a8617a8SJordan K. Hubbard sign=hx&0x80000000; /* sign= sign(x) */ 593a8617a8SJordan K. Hubbard hx ^=sign; 603a8617a8SJordan K. Hubbard if(hx>=0x7f800000) return(x+x); /* cbrt(NaN,INF) is itself */ 613a8617a8SJordan K. Hubbard if(hx==0) 623a8617a8SJordan K. Hubbard return(x); /* cbrt(0) is itself */ 633a8617a8SJordan K. Hubbard 643a8617a8SJordan K. Hubbard SET_FLOAT_WORD(x,hx); /* x <- |x| */ 653a8617a8SJordan K. Hubbard /* rough cbrt to 5 bits */ 663a8617a8SJordan K. Hubbard if(hx<0x00800000) /* subnormal number */ 673a8617a8SJordan K. Hubbard {SET_FLOAT_WORD(t,0x4b800000); /* set t= 2**24 */ 683a8617a8SJordan K. Hubbard t*=x; GET_FLOAT_WORD(high,t); SET_FLOAT_WORD(t,high/3+B2); 693a8617a8SJordan K. Hubbard } 703a8617a8SJordan K. Hubbard else 713a8617a8SJordan K. Hubbard SET_FLOAT_WORD(t,hx/3+B1); 723a8617a8SJordan K. Hubbard 733a8617a8SJordan K. Hubbard 743a8617a8SJordan K. Hubbard /* new cbrt to 23 bits */ 753a8617a8SJordan K. Hubbard r=t*t/x; 763a8617a8SJordan K. Hubbard s=C+r*t; 773a8617a8SJordan K. Hubbard t*=G+F/(s+E+D/s); 783a8617a8SJordan K. Hubbard 793a8617a8SJordan K. Hubbard /* retore the sign bit */ 803a8617a8SJordan K. Hubbard GET_FLOAT_WORD(high,t); 813a8617a8SJordan K. Hubbard SET_FLOAT_WORD(t,high|sign); 823a8617a8SJordan K. Hubbard return(t); 833a8617a8SJordan K. Hubbard } 84