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 177f3dea24SPeter Wemm static char rcsid[] = "$FreeBSD$"; 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 static const unsigned 273a8617a8SJordan K. Hubbard B1 = 709958130, /* B1 = (84+2/3-0.03306235651)*2**23 */ 283a8617a8SJordan K. Hubbard B2 = 642849266; /* B2 = (76+2/3-0.03306235651)*2**23 */ 293a8617a8SJordan K. Hubbard 303a8617a8SJordan K. Hubbard static const float 313a8617a8SJordan K. Hubbard C = 5.4285717010e-01, /* 19/35 = 0x3f0af8b0 */ 323a8617a8SJordan K. Hubbard D = -7.0530611277e-01, /* -864/1225 = 0xbf348ef1 */ 333a8617a8SJordan K. Hubbard E = 1.4142856598e+00, /* 99/70 = 0x3fb50750 */ 343a8617a8SJordan K. Hubbard F = 1.6071428061e+00, /* 45/28 = 0x3fcdb6db */ 353a8617a8SJordan K. Hubbard G = 3.5714286566e-01; /* 5/14 = 0x3eb6db6e */ 363a8617a8SJordan K. Hubbard 3759b19ff1SAlfred Perlstein float 3859b19ff1SAlfred Perlstein cbrtf(float x) 393a8617a8SJordan K. Hubbard { 403a8617a8SJordan K. Hubbard float r,s,t; 413a8617a8SJordan K. Hubbard int32_t hx; 423a8617a8SJordan K. Hubbard u_int32_t sign; 433a8617a8SJordan K. Hubbard u_int32_t high; 443a8617a8SJordan K. Hubbard 453a8617a8SJordan K. Hubbard GET_FLOAT_WORD(hx,x); 463a8617a8SJordan K. Hubbard sign=hx&0x80000000; /* sign= sign(x) */ 473a8617a8SJordan K. Hubbard hx ^=sign; 483a8617a8SJordan K. Hubbard if(hx>=0x7f800000) return(x+x); /* cbrt(NaN,INF) is itself */ 493a8617a8SJordan K. Hubbard if(hx==0) 503a8617a8SJordan K. Hubbard return(x); /* cbrt(0) is itself */ 513a8617a8SJordan K. Hubbard 523a8617a8SJordan K. Hubbard SET_FLOAT_WORD(x,hx); /* x <- |x| */ 533a8617a8SJordan K. Hubbard /* rough cbrt to 5 bits */ 543a8617a8SJordan K. Hubbard if(hx<0x00800000) /* subnormal number */ 553a8617a8SJordan K. Hubbard {SET_FLOAT_WORD(t,0x4b800000); /* set t= 2**24 */ 563a8617a8SJordan K. Hubbard t*=x; GET_FLOAT_WORD(high,t); SET_FLOAT_WORD(t,high/3+B2); 573a8617a8SJordan K. Hubbard } 583a8617a8SJordan K. Hubbard else 593a8617a8SJordan K. Hubbard SET_FLOAT_WORD(t,hx/3+B1); 603a8617a8SJordan K. Hubbard 613a8617a8SJordan K. Hubbard 623a8617a8SJordan K. Hubbard /* new cbrt to 23 bits */ 633a8617a8SJordan K. Hubbard r=t*t/x; 643a8617a8SJordan K. Hubbard s=C+r*t; 653a8617a8SJordan K. Hubbard t*=G+F/(s+E+D/s); 663a8617a8SJordan K. Hubbard 673a8617a8SJordan K. Hubbard /* retore the sign bit */ 683a8617a8SJordan K. Hubbard GET_FLOAT_WORD(high,t); 693a8617a8SJordan K. Hubbard SET_FLOAT_WORD(t,high|sign); 703a8617a8SJordan K. Hubbard return(t); 713a8617a8SJordan K. Hubbard } 72