00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef _FP_H
00044 #define _FP_H
00045
00046
00047
00048
00049 #ifdef _CRAYIEEE
00050
00051
00052 #define FP_NAN 0
00053 #define FP_INFINITE 1
00054 #define FP_NORMAL 2
00055 #define FP_SUBNORMAL 3
00056 #define FP_ZERO 4
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 #ifdef _LD64
00070 #define DECIMAL_DIG 17
00071 #else
00072 #define DECIMAL_DIG 36
00073 #endif
00074
00075 #if defined(_CRAY1) || defined(_CRAYT3E)
00076 #include <sys/cdefs.h>
00077
00078 __BEGIN_DECLS
00079
00080
00081 extern const double __fp_nan;
00082 #define NAN (__fp_nan)
00083
00084 extern const double __fp_infinity;
00085 #define INFINITY (__fp_infinity)
00086
00087 #else
00088
00089
00090
00091
00092 #define NAN 0X7FFFFFFFFFFFFFFF.
00093
00094
00095
00096 #define INFINITY 0X7FF0000000000000.
00097
00098 #endif
00099
00100
00101 #if defined(_CRAY1)
00102
00103 #ifndef HUGE_VALF
00104 extern const float __fp_infinityf;
00105 #define HUGE_VALF (__fp_infinityf)
00106 #endif
00107
00108
00109 #ifndef HUGE_VAL
00110 #define HUGE_VAL (__fp_infinity)
00111 #endif
00112
00113
00114 #ifndef HUGE_VALL
00115 extern const long double __fp_infinityl;
00116 #define HUGE_VALL (__fp_infinityl)
00117 #endif
00118
00119 #else
00120
00121
00122
00123
00124 #ifndef HUGE_VAL
00125 #define HUGE_VAL 0X7FEFFFFFFFFFFFFF.
00126 #endif
00127
00128 #endif
00129
00130 #if defined(_CRAY1) || defined(_CRAYT3E)
00131
00132
00133
00134 extern int _fpclassifyf(float);
00135 extern int _fpclassify(double);
00136 extern int _fpclassifyl(long double);
00137
00138 extern int _signbitf(float);
00139 extern int _signbit(double);
00140 extern int _signbitl(long double);
00141
00142 extern int _isfinitef(float);
00143 extern int _isfinite(double);
00144 extern int _isfinitel(long double);
00145
00146 extern int _isnormalf(float);
00147 extern int _isnormal(double);
00148 extern int _isnormall(long double);
00149
00150 extern int _isnanf(float);
00151 extern int _isnan(double);
00152 extern int _isnanl(long double);
00153
00154 extern int _isgreaterf(float, float);
00155 extern int _isgreater(double, double);
00156 extern int _isgreaterl(long double, long double);
00157
00158 extern int _isgreaterequalf(float, float);
00159 extern int _isgreaterequal(double, double);
00160 extern int _isgreaterequall(long double, long double);
00161
00162 extern int _islessf(float, float);
00163 extern int _isless(double, double);
00164 extern int _islessl(long double, long double);
00165
00166 extern int _islessequalf(float, float);
00167 extern int _islessequal(double, double);
00168 extern int _islessequall(long double, long double);
00169
00170 extern int _islessgreaterf(float, float);
00171 extern int _islessgreater(double, double);
00172 extern int _islessgreaterl(long double, long double);
00173
00174 extern int _isunorderedf(float, float);
00175 extern int _isunordered(double, double);
00176 extern int _isunorderedl(long double, long double);
00177
00178 extern float _remainderf(float, float);
00179 extern double _remainder(double, double);
00180 extern long double _remainderl(long double, long double);
00181
00182 extern float _rintf(float);
00183 extern double _rint(double);
00184 extern long double _rintl(long double);
00185
00186 extern float _copysignf(float, float);
00187 extern double _copysign(double, double);
00188 extern long double _copysignl(long double, long double);
00189
00190 extern float _scalbf(float, long);
00191 extern double _scalb(double, long);
00192 extern long double _scalbl(long double, long);
00193
00194 extern float _logbf(float);
00195 extern double _logb(double);
00196 extern long double _logbl(long double);
00197
00198 extern float _nextafterf(float, float);
00199 extern double _nextafter(double, double);
00200 extern long double _nextafterl(long double, long double);
00201
00202 extern long int _rinttol(long double);
00203
00204
00205
00206 #define fpclassify(X) ((sizeof(X) == sizeof(double)) ? _fpclassify(X) : \
00207 (sizeof(X) == sizeof(float)) ? _fpclassifyf(X) : \
00208 _fpclassifyl(X))
00209
00210 #define signbit(X) ((sizeof(X) == sizeof(double)) ? _signbit(X) : \
00211 (sizeof(X) == sizeof(float)) ? _signbitf(X) : \
00212 _signbitl(X))
00213
00214 #define isfinite(X) ((sizeof(X) == sizeof(double)) ? _isfinite(X) : \
00215 (sizeof(X) == sizeof(float)) ? _isfinitef(X) : \
00216 _isfinitel(X))
00217
00218 #define isnormal(X) ((sizeof(X) == sizeof(double)) ? _isnormal(X) : \
00219 (sizeof(X) == sizeof(float)) ? _isnormalf(X) : \
00220 _isnormall(X))
00221
00222 #define isnan(X) ((sizeof(X) == sizeof(double)) ? _isnan(X) : \
00223 (sizeof(X) == sizeof(float)) ? _isnanf(X) : \
00224 _isnanl(X))
00225
00226 #define isgreater(X,Y) ((sizeof(X) == sizeof(long double) || \
00227 sizeof(Y) == sizeof(long double)) ? \
00228 _isgreaterl(X, Y) : \
00229 (sizeof(X) == sizeof(double) || \
00230 sizeof(Y) == sizeof(double)) ? \
00231 _isgreater(X, Y) : \
00232 _isgreaterf(X, Y))
00233
00234 #define isgreaterequal(X,Y) ((sizeof(X) == sizeof(long double) || \
00235 sizeof(Y) == sizeof(long double)) ? \
00236 _isgreaterequall(X, Y) : \
00237 (sizeof(X) == sizeof(double) || \
00238 sizeof(Y) == sizeof(double)) ? \
00239 _isgreaterequal(X, Y) : \
00240 _isgreaterequalf(X, Y))
00241
00242 #define isless(X,Y) ((sizeof(X) == sizeof(long double) || \
00243 sizeof(Y) == sizeof(long double)) ? \
00244 _islessl(X, Y) : \
00245 (sizeof(X) == sizeof(double) || \
00246 sizeof(Y) == sizeof(double)) ? \
00247 _isless(X, Y) : \
00248 _islessf(X, Y))
00249
00250 #define islessequal(X,Y) ((sizeof(X) == sizeof(long double) || \
00251 sizeof(Y) == sizeof(long double)) ? \
00252 _islessequall(X, Y) : \
00253 (sizeof(X) == sizeof(double) || \
00254 sizeof(Y) == sizeof(double)) ? \
00255 _islessequal(X, Y) : \
00256 _islessequalf(X, Y))
00257
00258 #define islessgreater(X,Y) ((sizeof(X) == sizeof(long double) || \
00259 sizeof(Y) == sizeof(long double)) ? \
00260 _islessgreaterl(X, Y) : \
00261 (sizeof(X) == sizeof(double) || \
00262 sizeof(Y) == sizeof(double)) ? \
00263 _islessgreater(X, Y) : \
00264 _islessgreaterf(X, Y))
00265
00266 #define isunordered(X,Y) ((sizeof(X) == sizeof(long double) || \
00267 sizeof(Y) == sizeof(long double)) ? \
00268 _isunorderedl(X, Y) : \
00269 (sizeof(X) == sizeof(double) || \
00270 sizeof(Y) == sizeof(double)) ? \
00271 _isunordered(X, Y) : \
00272 _isunorderedf(X, Y))
00273
00274
00275
00276
00277
00278 extern float remainderf(float, float);
00279 extern double remainder(double, double);
00280 extern long double remainderl(long double, long double);
00281
00282 extern float rintf(float);
00283 extern double rint(double);
00284 extern long double rintl(long double);
00285
00286 extern float copysignf(float, float);
00287 extern double copysign(double, double);
00288 extern long double copysignl(long double, long double);
00289
00290 extern float scalbf(float, long);
00291 extern double scalb(double, long);
00292 extern long double scalbl(long double, long);
00293
00294 extern float logbf(float);
00295 extern double logb(double);
00296 extern long double logbl(long double);
00297
00298 extern float nextafterf(float, float);
00299 extern double nextafter(double, double);
00300 extern double nextafterd(double, double);
00301 extern long double nextafterl(long double, long double);
00302
00303 extern long int rinttol(long double);
00304
00305
00306
00307
00308
00309 #define remainderf(X, Y) _remainderf(X, Y)
00310 #define remainder(X, Y) _remainder(X, Y)
00311 #define remainderl(X, Y) _remainderl(X, Y)
00312
00313 #define rintf(X) _rintf(X)
00314 #define rint(X) _rint(X)
00315 #define rintl(X) _rintl(X)
00316
00317 #define copysignf(X, Y) _copysignf(X, Y)
00318 #define copysign(X, Y) _copysign(X, Y)
00319 #define copysignl(X, Y) _copysignl(X, Y)
00320
00321 #define scalbf(X, Y) _scalbf(X, Y)
00322 #define scalb(X, Y) _scalb(X, Y)
00323 #define scalbl(X, Y) _scalbl(X, Y)
00324
00325 #define logbf(X) _logbf(X)
00326 #define logb(X) _logb(X)
00327 #define logbl(X) _logbl(X)
00328
00329 #define nextafterf(X, Y) _nextafterf(X, Y)
00330 #define nextafter(X, Y) _nextafter(X, Y)
00331 #define nextafterd(X, Y) _nextafter(X, Y)
00332 #define nextafterl(X, Y) _nextafterl(X, Y)
00333
00334 #define rinttol(X) _rinttol(X)
00335
00336
00337 __END_DECLS
00338 #endif
00339
00340 #if __STDC__ != 1
00341
00342
00343
00344
00345
00346 #define IEEE_64_SIGN_BIT 0X8000000000000000
00347 #define IEEE_64_EXPONENT 0X7FF0000000000000
00348 #define IEEE_64_MANTISSA 0X000FFFFFFFFFFFFF
00349 #define IEEE_64_IMPLICIT_BIT 0X0010000000000000
00350 #define IEEE_64_EXPO_BIAS 1023
00351 #define IEEE_64_EXPO_BITS 11
00352 #define IEEE_64_EXPO_MAX 0X7FF
00353 #define IEEE_64_MANT_BITS 52
00354 #define IEEE_64_MANT_MAX 0XFFFFFFFFFFFFF
00355 #define IEEE_64_EXPO_ALL_ONES(X) (((X)&IEEE_64_EXPONENT)==IEEE_64_EXPONENT)
00356 #define IEEE_64_ABS_VALUE 0X7FFFFFFFFFFFFFFF
00357
00358
00359
00360 union _ieee_double {
00361 double dword;
00362 long long lword;
00363 struct {
00364 #if __BYTE_ORDER == __LITTLE_ENDIAN
00365 unsigned int mantissa : IEEE_64_MANT_BITS;
00366 unsigned int exponent : IEEE_64_EXPO_BITS;
00367 unsigned int sign : 1;
00368 #else
00369 unsigned int sign : 1;
00370 unsigned int exponent : IEEE_64_EXPO_BITS;
00371 unsigned int mantissa : IEEE_64_MANT_BITS;
00372 #endif
00373 } parts;
00374 };
00375
00376 #if !defined(_CRAY1) && !defined(_CRAYT3E)
00377
00378
00379 typedef double float_t;
00380 typedef double double_t;
00381
00382
00383
00384 #define fpclassify(x) ((sizeof(x)==sizeof(double)) ? __fpclassifyd(x) \
00385 : printf("%s %d: fpclassify() only supported for double\n", \
00386 __FILE__, __LINE__))
00387 static int __fpclassifyd(x)
00388 double x;
00389 {
00390 union _ieee_double x_val;
00391 x_val.dword = x;
00392 if (x_val.parts.exponent==0) {
00393 return (x_val.parts.mantissa==0 ? FP_ZERO : FP_SUBNORMAL);
00394 }
00395 else if (IEEE_64_EXPO_ALL_ONES(x_val.lword)) {
00396 return (x_val.parts.mantissa==0 ? FP_INFINITE : FP_NAN);
00397 }
00398 else {
00399 return (FP_NORMAL);
00400 }
00401 }
00402
00403
00404
00405
00406 #pragma _CRI inline signbit
00407 static int signbit(double xarg)
00408 {
00409 union _ieee_double x;
00410 x.dword = xarg;
00411 return( x.parts.sign);
00412 }
00413
00414
00415 #define aint(x) __aint(x)
00416 static double __aint(x)
00417 double x;
00418 {
00419 double fabs(double);
00420 #define _AINT_MAXVAL 4503599627370496.0
00421 return( (fabs(x) >= _AINT_MAXVAL) ? x : (double) ((long) x) );
00422 }
00423
00424
00425
00426 #define isinf(x) __is_infinite(x)
00427 static int __is_infinite(double xarg)
00428 {
00429 union _ieee_double x;
00430 x.dword = xarg;
00431 return( (x.lword&IEEE_64_ABS_VALUE)==IEEE_64_EXPONENT );
00432 }
00433
00434
00435
00436
00437
00438 #define isfinite(x) __is_finite(x)
00439 static int __is_finite(double xarg)
00440 {
00441 union _ieee_double x;
00442 x.dword = xarg;
00443 return(!IEEE_64_EXPO_ALL_ONES(x.lword));
00444 }
00445
00446
00447
00448
00449 #define isnormal(x) __is_normal(x)
00450 static int __is_normal(double xarg)
00451 {
00452 union _ieee_double x;
00453 x.dword = xarg;
00454 return(!IEEE_64_EXPO_ALL_ONES(x.lword) && (x.lword&IEEE_64_EXPONENT)!=0);
00455 }
00456
00457
00458
00459
00460
00461 #define isnan(x) __is_nan(x)
00462 static int __is_nan(double xarg)
00463 {
00464 union _ieee_double x;
00465 x.dword = xarg;
00466 return(IEEE_64_EXPO_ALL_ONES(x.lword) && (x.lword&IEEE_64_MANTISSA)!=0);
00467 }
00468
00469
00470
00471 static double logb(x)
00472 double x;
00473 {
00474 switch (fpclassify(x)) {
00475 case FP_NAN:
00476 return(x);
00477
00478 case FP_INFINITE:
00479 return(INFINITY);
00480
00481 case FP_NORMAL:
00482 {
00483 union _ieee_double x_val;
00484 x_val.dword = x;
00485
00486 return(x_val.parts.exponent - IEEE_64_EXPO_BIAS);
00487 }
00488
00489 case FP_SUBNORMAL:
00490 {
00491 union _ieee_double x_val;
00492 x_val.dword = x;
00493
00494
00495
00496
00497 return(-IEEE_64_EXPO_BIAS - _leadz(x_val.parts.mantissa) +
00498 IEEE_64_EXPO_BITS);
00499 }
00500
00501 case FP_ZERO:
00502
00503 {
00504 union _ieee_double x_val;
00505 x_val.dword = INFINITY;
00506 x_val.parts.sign = 1;
00507
00508 return(x_val.dword);
00509 }
00510
00511 }
00512 }
00513
00514
00515 static double scalb(double x, long n)
00516 {
00517 int fp_class = fpclassify(x);
00518
00519 if (fp_class==FP_NORMAL) {
00520 union _ieee_double x_val;
00521 long exponent;
00522 x_val.dword = x;
00523
00524 exponent = x_val.parts.exponent + n;
00525
00526 if (exponent <= 0) {
00527
00528 long full_mantissa = x_val.parts.mantissa;
00529
00530
00531 full_mantissa |= IEEE_64_IMPLICIT_BIT;
00532
00533
00534 full_mantissa >>= -exponent + 1;
00535
00536
00537 x_val.parts.exponent = 0;
00538 x_val.parts.mantissa = full_mantissa;
00539 }
00540 else if ((exponent>>IEEE_64_EXPO_BITS) != 0) {
00541
00542
00543
00544 x_val.dword = INFINITY;
00545 x_val.parts.sign = signbit(x);
00546 }
00547 else {
00548 x_val.parts.exponent = exponent;
00549 }
00550 return(x_val.dword);
00551 }
00552 else if (fp_class==FP_SUBNORMAL) {
00553 union _ieee_double x_val;
00554 x_val.dword = x;
00555
00556 if (n <= 0) {
00557 x_val.parts.mantissa = x_val.parts.mantissa >> (-n);
00558 }
00559 else {
00560 long mantissa_bits_to_fill = _leadz(x_val.parts.mantissa);
00561
00562 if (mantissa_bits_to_fill >= n) {
00563 x_val.parts.mantissa = x_val.parts.mantissa << n;
00564 }
00565 else {
00566
00567
00568 x_val.parts.mantissa = x_val.parts.mantissa <<
00569 (mantissa_bits_to_fill + 1);
00570 x_val.parts.exponent = n - mantissa_bits_to_fill + 1;
00571 }
00572 }
00573
00574 return(x_val.dword);
00575 }
00576 else {
00577 return(x);
00578 }
00579 }
00580
00581
00582
00583 #pragma _CRI inline copysign
00584 static double copysign(double x, double y)
00585 {
00586 union _ieee_double x_val;
00587
00588 x_val.dword = x;
00589 x_val.parts.sign = signbit(y);
00590 return x_val.dword;
00591 }
00592
00593
00594
00595 static double nextafter(double x, double y)
00596 {
00597 int x_fp_class = fpclassify(x);
00598 int y_fp_class = fpclassify(y);
00599
00600 if (x_fp_class==FP_NAN) {
00601 return x;
00602 }
00603 else if (y_fp_class==FP_NAN) {
00604 return y;
00605 }
00606 else if (x_fp_class==FP_ZERO && y_fp_class==FP_ZERO) {
00607 return y;
00608 }
00609 else if (x==y || x_fp_class==FP_INFINITE) {
00610 return x;
00611 }
00612 else if (x_fp_class==FP_ZERO) {
00613 union _ieee_double x_val;
00614
00615 x_val.parts.exponent = 1;
00616 x_val.parts.mantissa = 0;
00617 x_val.parts.sign = x > y;
00618
00619
00620 return(x_val.dword);
00621 }
00622 else {
00623 union _ieee_double x_val;
00624 long full_mantissa;
00625
00626 x_val.dword = x;
00627
00628
00629
00630
00631 x_val.lword += (x>y) ? -1 : 1;
00632
00633
00634
00635 return(x_val.dword);
00636 }
00637 }
00638 #endif
00639 #ifndef _LD64
00640
00641 #define IEEE_128_SIGN_BIT 0X8000000000000000
00642 #define IEEE_128_EXPONENT 0X7FFF000000000000
00643 #define IEEE_128_MANTISSA_UP 0X0000FFFFFFFFFFFF
00644 #define IEEE_128_MANTISSA_LOW 0XFFFFFFFFFFFFFFFF
00645 #define IEEE_128_IMPLICIT_BIT 0X0001000000000000
00646 #define IEEE_128_EXPO_BITS 15
00647 #define IEEE_128_EXPO_MAX 0X7FFF
00648 #define IEEE_128_EXPO_BIAS 16383
00649 #define IEEE_128_MANT_BITS 112
00650 #define IEEE_128_MANT_BITS_UP 48
00651 #define IEEE_128_MANT_BITS_LOW 64
00652 #define IEEE_128_EXPO_ALL_ONES(X) (((X)&IEEE_128_EXPONENT)==IEEE_128_EXPONENT)
00653 #define IEEE_128_ABS_VALUE 0X7FFFFFFFFFFFFFFF
00654
00655
00656
00657 #define INFINITY_128_UP 0X7FFF000000000000
00658 #define INFINITY_128_LOW 0
00659
00660
00661 union _ieee_ldouble {
00662 long double dword;
00663 long long lword[2];
00664 struct {
00665 #if __BYTE_ORDER == __LITTLE_ENDIAN
00666 unsigned long long mantissa_low : IEEE_128_MANT_BITS_LOW;
00667 unsigned long long mantissa_up : IEEE_128_MANT_BITS_UP;
00668 unsigned long long exponent : IEEE_128_EXPO_BITS;
00669 unsigned long long sign : 1;
00670 #else
00671 unsigned long long sign : 1;
00672 unsigned long long exponent : IEEE_128_EXPO_BITS;
00673 unsigned long long mantissa_up : IEEE_128_MANT_BITS_UP;
00674 unsigned long long mantissa_low : IEEE_128_MANT_BITS_LOW;
00675 #endif
00676 } parts;
00677 };
00678
00679 #if defined(_CRAY1) || defined(_CRAYT3E)
00680 #define fpclassifyl(x) _fpclassifyl(x)
00681 #else
00682
00683 #define fpclassifyl(x) ((sizeof(x)==sizeof(long double)) ? __fpclassifyl(x) \
00684 : printf("%s %d: fpclassifyl() only supported for 128-bit\n", \
00685 __FILE__, __LINE__))
00686 static int __fpclassifyl(x)
00687 long double x;
00688 {
00689 union _ieee_ldouble x_val;
00690 x_val.dword = x;
00691 if (x_val.parts.exponent==0) {
00692 return ((x_val.parts.mantissa_up==0 && x_val.parts.mantissa_low==0 &&
00693 x_val.lword[1] == 0)
00694 ? FP_ZERO : FP_SUBNORMAL);
00695 }
00696 else if (IEEE_128_EXPO_ALL_ONES(x_val.lword[0])) {
00697 return ((x_val.parts.mantissa_up==0 && x_val.parts.mantissa_low==0 &&
00698 x_val.lword[1] == 0)
00699 ? FP_INFINITE : FP_NAN);
00700 } else {
00701 return (FP_NORMAL);
00702 }
00703 }
00704
00705
00706
00707
00708
00709 #pragma _CRI inline copysignl
00710 static double copysignl(long double x, long double y)
00711 {
00712 union _ieee_ldouble x_val;
00713
00714 x_val.dword = x;
00715 x_val.parts.sign = signbitl(y);
00716 return x_val.dword;
00717 }
00718
00719
00720
00721
00722
00723 static long double logbl(long double x)
00724 {
00725 switch (fpclassifyl(x)) {
00726 case FP_NAN:
00727 return(x);
00728 break;
00729
00730 case FP_INFINITE:
00731 {
00732 union _ieee_ldouble x_val;
00733 x_val.lword[0] = INFINITY_128_UP;
00734 x_val.lword[1] = INFINITY_128_LOW;
00735 return(x_val.dword);
00736 }
00737 break;
00738
00739 case FP_NORMAL:
00740 {
00741 union _ieee_ldouble x_val;
00742 x_val.dword = x;
00743
00744 return(x_val.parts.exponent - IEEE_128_EXPO_BIAS);
00745 }
00746 break;
00747
00748 case FP_SUBNORMAL:
00749 {
00750 union _ieee_ldouble x_val;
00751 int y;
00752 x_val.dword = x;
00753
00754
00755
00756
00757
00758 y = _leadz(x_val.parts.mantissa_up);
00759 if (y == 64)
00760 y += _leadz(x_val.parts.mantissa_low);
00761 return(-IEEE_128_EXPO_BIAS - y + IEEE_128_EXPO_BITS);
00762 }
00763 break;
00764
00765 case FP_ZERO:
00766
00767 {
00768 union _ieee_ldouble x_val;
00769 x_val.lword[0] = INFINITY_128_UP;
00770 x_val.lword[1] = INFINITY_128_LOW;
00771 x_val.parts.sign = 1;
00772
00773 return(x_val.dword);
00774 }
00775 break;
00776
00777 }
00778 }
00779
00780
00781 static long double scalbl(long double x, long n)
00782 {
00783 int fp_class = fpclassifyl(x);
00784
00785 if (fp_class==FP_NORMAL) {
00786 union _ieee_ldouble x_val;
00787 long exponent;
00788 x_val.dword = x;
00789
00790 exponent = x_val.parts.exponent + n;
00791
00792 if (exponent <= 0) {
00793
00794 unsigned long mantissa_bits;
00795 unsigned long mantissa_up = x_val.parts.mantissa_up;
00796 unsigned long mantissa_low = x_val.parts.mantissa_low;
00797 int shift;
00798
00799
00800 mantissa_up |= IEEE_128_IMPLICIT_BIT;
00801
00802
00803 shift = -exponent + 1;
00804 if (shift <= 64) {
00805 mantissa_bits = mantissa_up << (64 - shift);
00806 mantissa_up >>= shift;
00807 mantissa_low = (mantissa_low >> shift) | mantissa_bits;
00808 }
00809 else {
00810 mantissa_low = mantissa_up >> (shift - 64);
00811 mantissa_up = 0;
00812 }
00813
00814
00815 x_val.parts.exponent = 0;
00816 x_val.parts.mantissa_up = mantissa_up;
00817 x_val.parts.mantissa_low = mantissa_low;
00818 }
00819 else if ((exponent>>IEEE_128_EXPO_BITS) != 0) {
00820
00821
00822
00823 x_val.lword[0] = INFINITY_128_UP;
00824 x_val.lword[1] = INFINITY_128_LOW;
00825 x_val.parts.sign = signbitl(x);
00826 }
00827 else {
00828 x_val.parts.exponent = exponent;
00829 }
00830 return(x_val.dword);
00831 }
00832 else if (fp_class==FP_SUBNORMAL) {
00833 union _ieee_ldouble x_val;
00834 unsigned long mantissa_bits;
00835 unsigned long mantissa_up;
00836 unsigned long mantissa_low;
00837
00838 x_val.dword = x;
00839 mantissa_up = x_val.parts.mantissa_up;
00840 mantissa_low = x_val.parts.mantissa_low;
00841
00842 if (n <= 0) {
00843 n = -n;
00844 if (n <= 64) {
00845 mantissa_bits = mantissa_up << (64-n);
00846 mantissa_up >>= n;
00847 mantissa_low = mantissa_bits | (mantissa_low >> n);
00848 }
00849 else {
00850 mantissa_low = mantissa_up >> (n-64);
00851 mantissa_up = 0;
00852 }
00853 x_val.parts.mantissa_up = mantissa_up;
00854 x_val.parts.mantissa_low = mantissa_low;
00855 }
00856 else {
00857 long mantissa_bits_to_fill = _leadz(mantissa_up);
00858 if (mantissa_bits_to_fill == 64) {
00859 mantissa_bits_to_fill += _leadz(mantissa_low);
00860 }
00861
00862 if (mantissa_bits_to_fill >= n) {
00863 unsigned long mantissa_bits;
00864 if (n <= 64) {
00865 mantissa_bits = mantissa_low >> (64-n);
00866 mantissa_low <<= n;
00867 mantissa_up = mantissa_bits | (mantissa_up << n);
00868 }
00869 else {
00870 mantissa_up = mantissa_low << (n-64);
00871 mantissa_low = 0;
00872 }
00873 }
00874 else {
00875
00876
00877 int shift;
00878 shift = mantissa_bits_to_fill +1;
00879 if (shift <= 64) {
00880 mantissa_bits = mantissa_low << (64 - shift);
00881 mantissa_low <<= shift;
00882 mantissa_up = mantissa_bits | (mantissa_up << shift);
00883 }
00884 else {
00885 mantissa_up = mantissa_low << (shift-64);
00886 mantissa_low = 0;
00887 }
00888 x_val.parts.exponent = n - mantissa_bits_to_fill + 1;
00889 }
00890 x_val.parts.mantissa_low = mantissa_low;
00891 x_val.parts.mantissa_up = mantissa_up;
00892 }
00893
00894 return(x_val.dword);
00895 }
00896 else {
00897 return(x);
00898 }
00899 }
00900 #endif
00901 #endif
00902
00903 #endif
00904 #endif
00905
00906
00907 #if defined(_CRAYIEEE) || !defined(_UNICOS)
00908 #if (__STDC__ != 1) || defined(__mips) || defined(_LITTLE_ENDIAN)
00909
00910
00911 static const union { int i; float h; } _HNAN = { 0x7fc00000 };
00912
00913 #define _HALF_NaN _HNAN.h
00914
00915 #ifdef _CRAYIEEE
00916 static const union {
00917 long i;
00918 double s;
00919 } _SNAN = { 0x7ff8000000000000L };
00920 #else
00921 static const union {
00922 long long i;
00923 double s;
00924 } _SNAN = { 0x7ff8000000000000LL };
00925 #endif
00926
00927 #define _SGL_NaN _SNAN.s
00928
00929 #ifdef _CRAYIEEE
00930 static const union {
00931 struct {
00932 long ireal1;
00933 long ireal2;
00934 } dex;
00935 long double d;
00936 } _DNAN = { 0x7fff800000000000L, 0x0000000000000000L };
00937 #else
00938
00939
00940
00941
00942
00943
00944 static const union {
00945 struct {
00946 long long ireal1;
00947 long long ireal2;
00948 } dex;
00949 long double d;
00950 #ifdef __mips
00951 } _DNAN = { 0x7ff8000000000000LL, 0x0000000000000000LL };
00952 #else
00953 } _DNAN = { 0x7fff800000000000LL, 0x0000000000000000LL };
00954 #endif
00955 #endif
00956 #define _DBL_NaN _DNAN.d
00957 #endif
00958 #endif
00959 #endif