scalbf.c raw

   1  /* origin: FreeBSD /usr/src/lib/msun/src/e_scalbf.c */
   2  /*
   3   * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
   4   */
   5  /*
   6   * ====================================================
   7   * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
   8   *
   9   * Developed at SunPro, a Sun Microsystems, Inc. business.
  10   * Permission to use, copy, modify, and distribute this
  11   * software is freely granted, provided that this notice
  12   * is preserved.
  13   * ====================================================
  14   */
  15  
  16  #define _GNU_SOURCE
  17  #include <math.h>
  18  
  19  float scalbf(float x, float fn)
  20  {
  21  	if (isnan(x) || isnan(fn)) return x*fn;
  22  	if (!isfinite(fn)) {
  23  		if (fn > 0.0f)
  24  			return x*fn;
  25  		else
  26  			return x/(-fn);
  27  	}
  28  	if (rintf(fn) != fn) return (fn-fn)/(fn-fn);
  29  	if ( fn > 65000.0f) return scalbnf(x, 65000);
  30  	if (-fn > 65000.0f) return scalbnf(x,-65000);
  31  	return scalbnf(x,(int)fn);
  32  }
  33