scalbnl.c raw

   1  #include "libm.h"
   2  
   3  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
   4  long double scalbnl(long double x, int n)
   5  {
   6  	return scalbn(x, n);
   7  }
   8  #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
   9  long double scalbnl(long double x, int n)
  10  {
  11  	union ldshape u;
  12  
  13  	if (n > 16383) {
  14  		x *= 0x1p16383L;
  15  		n -= 16383;
  16  		if (n > 16383) {
  17  			x *= 0x1p16383L;
  18  			n -= 16383;
  19  			if (n > 16383)
  20  				n = 16383;
  21  		}
  22  	} else if (n < -16382) {
  23  		x *= 0x1p-16382L * 0x1p113L;
  24  		n += 16382 - 113;
  25  		if (n < -16382) {
  26  			x *= 0x1p-16382L * 0x1p113L;
  27  			n += 16382 - 113;
  28  			if (n < -16382)
  29  				n = -16382;
  30  		}
  31  	}
  32  	u.f = 1.0;
  33  	u.i.se = 0x3fff + n;
  34  	return x * u.f;
  35  }
  36  #endif
  37