Mercurial > hg > octave-nkf
comparison liboctave/lo-ieee.cc @ 4601:1ed6cfbc8ea4
[project @ 2003-11-12 18:30:29 by jwe]
author | jwe |
---|---|
date | Wed, 12 Nov 2003 18:30:29 +0000 |
parents | 6cb22b9e3942 |
children | 15ddd40fee90 |
comparison
equal
deleted
inserted
replaced
4600:3680bb30de0b | 4601:1ed6cfbc8ea4 |
---|---|
49 #include "mach-info.h" | 49 #include "mach-info.h" |
50 | 50 |
51 void | 51 void |
52 octave_ieee_init (void) | 52 octave_ieee_init (void) |
53 { | 53 { |
54 oct_mach_info::float_format ff = oct_mach_info::native_float_format (); | |
55 | |
56 if (ff == octave_mach_info::flt_fmt_vax_d | |
57 || ff == octave_mach_info::flt_fmt_vax_g | |
58 || ff == octave_mach_info::flt_fmt_cray) | |
59 { | |
60 octave_Inf = octave_NaN = octaveNA = DBL_MAX; | |
61 } | |
62 else | |
63 { | |
54 #if defined (HAVE_ISINF) || defined (HAVE_FINITE) | 64 #if defined (HAVE_ISINF) || defined (HAVE_FINITE) |
55 | 65 |
56 #if defined (SCO) | 66 #if defined (SCO) |
57 double tmp = 1.0; | 67 double tmp = 1.0; |
58 octave_Inf = 1.0 / (tmp - tmp); | 68 octave_Inf = 1.0 / (tmp - tmp); |
59 #elif defined (__alpha__) && defined (__osf__) | 69 #elif defined (__alpha__) && defined (__osf__) |
60 extern unsigned int DINFINITY[2]; | 70 extern unsigned int DINFINITY[2]; |
61 octave_Inf = (*(X_CAST(double *, DINFINITY))); | 71 octave_Inf = (*(X_CAST(double *, DINFINITY))); |
62 #else | 72 #else |
63 double tmp = 1e+10; | 73 double tmp = 1e+10; |
64 octave_Inf = tmp; | 74 octave_Inf = tmp; |
65 for (;;) | 75 for (;;) |
66 { | 76 { |
67 octave_Inf *= 1e+10; | 77 octave_Inf *= 1e+10; |
68 if (octave_Inf == tmp) | 78 if (octave_Inf == tmp) |
69 break; | 79 break; |
70 tmp = octave_Inf; | 80 tmp = octave_Inf; |
71 } | 81 } |
72 #endif | 82 #endif |
73 | 83 |
74 #endif | 84 #endif |
75 | 85 |
76 #if defined (HAVE_ISNAN) | 86 #if defined (HAVE_ISNAN) |
77 | 87 |
78 #if defined (__alpha__) && defined (__osf__) | 88 #if defined (__alpha__) && defined (__osf__) |
79 extern unsigned int DQNAN[2]; | 89 extern unsigned int DQNAN[2]; |
80 octave_NaN = (*(X_CAST(double *, DQNAN))); | 90 octave_NaN = (*(X_CAST(double *, DQNAN))); |
81 #else | 91 #else |
82 octave_NaN = octave_Inf / octave_Inf; | 92 octave_NaN = octave_Inf / octave_Inf; |
83 #endif | 93 #endif |
84 | 94 |
85 // This is patterned after code in R. | 95 // This is patterned after code in R. |
86 | 96 |
87 oct_mach_info::float_format ff = oct_mach_info::native_float_format (); | 97 if (ff == oct_mach_info::flt_fmt_ieee_big_endian) |
98 { | |
99 lo_ieee_hw = 0; | |
100 lo_ieee_lw = 1; | |
101 } | |
102 else | |
103 { | |
104 lo_ieee_hw = 1; | |
105 lo_ieee_lw = 0; | |
106 } | |
88 | 107 |
89 if (ff == oct_mach_info::flt_fmt_ieee_big_endian) | 108 lo_ieee_double t; |
90 { | 109 t.word[lo_ieee_hw] = LO_IEEE_NA_HW; |
91 lo_ieee_hw = 0; | 110 t.word[lo_ieee_lw] = LO_IEEE_NA_LW; |
92 lo_ieee_lw = 1; | |
93 } | |
94 else | |
95 { | |
96 lo_ieee_hw = 1; | |
97 lo_ieee_lw = 0; | |
98 } | |
99 | 111 |
100 lo_ieee_double t; | 112 octave_NA = t.value; |
101 t.word[lo_ieee_hw] = LO_IEEE_NA_HW; | |
102 t.word[lo_ieee_lw] = LO_IEEE_NA_LW; | |
103 | |
104 octave_NA = t.value; | |
105 | 113 |
106 #endif | 114 #endif |
115 } | |
107 } | 116 } |
108 | 117 |
109 /* | 118 /* |
110 ;;; Local Variables: *** | 119 ;;; Local Variables: *** |
111 ;;; mode: C++ *** | 120 ;;; mode: C++ *** |