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

     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  }