1141296Sdas
2141296Sdas/* @(#)e_scalb.c 1.3 95/01/18 */
32116Sjkh/*
42116Sjkh * ====================================================
52116Sjkh * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
62116Sjkh *
7141296Sdas * Developed at SunSoft, a Sun Microsystems, Inc. business.
82116Sjkh * Permission to use, copy, modify, and distribute this
9141296Sdas * software is freely granted, provided that this notice
102116Sjkh * is preserved.
112116Sjkh * ====================================================
122116Sjkh */
132116Sjkh
14176451Sdas#include <sys/cdefs.h>
15176451Sdas__FBSDID("$FreeBSD$");
162116Sjkh
172116Sjkh/*
182116Sjkh * __ieee754_scalb(x, fn) is provide for
19141296Sdas * passing various standard test suite. One
202116Sjkh * should use scalbn() instead.
212116Sjkh */
222116Sjkh
232116Sjkh#include "math.h"
242116Sjkh#include "math_private.h"
252116Sjkh
262116Sjkh#ifdef _SCALB_INT
2797413Salfreddouble
28117912Speter__ieee754_scalb(double x, int fn)
292116Sjkh#else
3097413Salfreddouble
31117912Speter__ieee754_scalb(double x, double fn)
322116Sjkh#endif
332116Sjkh{
342116Sjkh#ifdef _SCALB_INT
352116Sjkh	return scalbn(x,fn);
362116Sjkh#else
37141296Sdas	if (isnan(x)||isnan(fn)) return x*fn;
382116Sjkh	if (!finite(fn)) {
392116Sjkh	    if(fn>0.0) return x*fn;
402116Sjkh	    else       return x/(-fn);
412116Sjkh	}
422116Sjkh	if (rint(fn)!=fn) return (fn-fn)/(fn-fn);
432116Sjkh	if ( fn > 65000.0) return scalbn(x, 65000);
442116Sjkh	if (-fn > 65000.0) return scalbn(x,-65000);
452116Sjkh	return scalbn(x,(int)fn);
462116Sjkh#endif
472116Sjkh}
48