scalb.c raw

   1  /* origin: FreeBSD /usr/src/lib/msun/src/e_scalb.c */
   2  /*
   3   * ====================================================
   4   * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
   5   *
   6   * Developed at SunSoft, a Sun Microsystems, Inc. business.
   7   * Permission to use, copy, modify, and distribute this
   8   * software is freely granted, provided that this notice
   9   * is preserved.
  10   * ====================================================
  11   */
  12  /*
  13   * scalb(x, fn) is provide for
  14   * passing various standard test suite. One
  15   * should use scalbn() instead.
  16   */
  17  
  18  #define _GNU_SOURCE
  19  #include <math.h>
  20  
  21  double scalb(double x, double fn)
  22  {
  23  	if (isnan(x) || isnan(fn))
  24  		return x*fn;
  25  	if (!isfinite(fn)) {
  26  		if (fn > 0.0)
  27  			return x*fn;
  28  		else
  29  			return x/(-fn);
  30  	}
  31  	if (rint(fn) != fn) return (fn-fn)/(fn-fn);
  32  	if ( fn > 65000.0) return scalbn(x, 65000);
  33  	if (-fn > 65000.0) return scalbn(x,-65000);
  34  	return scalbn(x,(int)fn);
  35  }
  36