e_scalb.c revision 97413
1237578Sobrien/* @(#)e_scalb.c 5.1 93/09/24 */ 2237578Sobrien/* 3237578Sobrien * ==================================================== 4237578Sobrien * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 5237578Sobrien * 6237578Sobrien * Developed at SunPro, a Sun Microsystems, Inc. business. 7237578Sobrien * Permission to use, copy, modify, and distribute this 8237578Sobrien * software is freely granted, provided that this notice 9237578Sobrien * is preserved. 10237578Sobrien * ==================================================== 11237578Sobrien */ 12237578Sobrien 13237578Sobrien#ifndef lint 14237578Sobrienstatic char rcsid[] = "$FreeBSD: head/lib/msun/src/e_scalb.c 97413 2002-05-28 18:15:04Z alfred $"; 15237578Sobrien#endif 16237578Sobrien 17237578Sobrien/* 18237578Sobrien * __ieee754_scalb(x, fn) is provide for 19237578Sobrien * passing various standard test suite. One 20237578Sobrien * should use scalbn() instead. 21237578Sobrien */ 22237578Sobrien 23237578Sobrien#include "math.h" 24237578Sobrien#include "math_private.h" 25237578Sobrien 26237578Sobrien#ifdef _SCALB_INT 27237578Sobriendouble 28237578Sobrien__generic___ieee754_scalb(double x, int fn) 29237578Sobrien#else 30237578Sobriendouble 31237578Sobrien__generic___ieee754_scalb(double x, double fn) 32237578Sobrien#endif 33237578Sobrien{ 34237578Sobrien#ifdef _SCALB_INT 35237578Sobrien return scalbn(x,fn); 36237578Sobrien#else 37237578Sobrien if (isnan(x)||isnan(fn)) return x*fn; 38237578Sobrien if (!finite(fn)) { 39237578Sobrien if(fn>0.0) return x*fn; 40237578Sobrien else return x/(-fn); 41237578Sobrien } 42237578Sobrien if (rint(fn)!=fn) return (fn-fn)/(fn-fn); 43237578Sobrien if ( fn > 65000.0) return scalbn(x, 65000); 44237578Sobrien if (-fn > 65000.0) return scalbn(x,-65000); 45237578Sobrien return scalbn(x,(int)fn); 46#endif 47} 48