github.com/afumu/libc@v0.0.6/musl/src/math/scalb.c (about)

     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  }