File: rtest_float_inf.mac

package info (click to toggle)
maxima 5.47.0-9
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 193,104 kB
  • sloc: lisp: 434,678; fortran: 14,665; tcl: 10,990; sh: 4,577; makefile: 2,763; ansic: 447; java: 328; python: 262; perl: 201; xml: 60; awk: 28; sed: 15; javascript: 2
file content (120 lines) | stat: -rw-r--r-- 3,822 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* some tests for non-numeric floats
 * these are only meaningful for Lisps which support such values
 * GCL, ECL, SBCL, maybe others;
 *
 * SBCL: allows both inf/-inf and NaN; enable via:
 * :lisp (sb-vm::set-floating-point-modes :traps nil)
 *
 * GCL: allows both inf/-inf and NaN;
 * requires *PRINT-NAN* = T but that's already enabled by Maxima
 *
 * ECL: allows only inf/-inf, not NaN
 * (although maybe in a future version)
 * no special action needed to enable, as far as I know
 */

kill (all);
done;

(is_sbcl : is (ssearch ("SBCL", build_info()@lisp_name) # false),
 is_gcl : is (ssearch ("GCL", build_info()@lisp_name) # false),
 is_ecl : is (ssearch ("ECL", build_info()@lisp_name) # false),
 is (is_sbcl or is_gcl or is_ecl));
true;

(x:1e300, i:x*x, if not is_ecl then n:i-i, minusi:-i, 0);
0;

/* Maxima "=" calls ALIKE1 which compares atoms with EQUAL.
 * As long as that's the case, we expect is(n=n) => true.
 */
[is(x=x), is(i=i), if is_ecl then [] else is(n=n), is(minusi=minusi)];
[true, true, true, true];

/* Lisp "=" yields false for NaN. */
[?\=(x, x), ?\=(i, i), if is_ecl then [] else ?\=(n, n), ?\=(minusi, minusi)];
[true, true, false, true];

/* bfloat and rat should trigger an error on non-numeric floats */

errcatch(bfloat(i));
[];

if is_ecl then false else errcatch(bfloat(n));
[];

errcatch(bfloat(minusi));
[];

/* GCL: rat(nonnumeric) => hangs; SF bug report # !! */

if not is_gcl then errcatch(rat(i));
[];

if is_ecl then false else if not is_gcl then errcatch(rat(n));
[];

if not is_gcl then errcatch(rat(minusi));
[];

/* Fortran output should produce INF/-INF or NAN */

map (fortran, ' ['x = x, 'i = i, 'n = n, 'minusi = minusi]);
[done, done, done, done];

/* At present, Maxima will output implementation-dependent
 * representations of non-numeric floats.
 */

string('x = x);
''(if is_sbcl then "x = 1.0e+300"
   elseif is_gcl then "x = 1.0E+300"
   elseif is_ecl then "x = 1.0e+300");

string('i = i);
''(if is_sbcl then "i = #.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY"
   elseif is_gcl then "i = #<inf>"
   elseif is_ecl then "i = #.ext::double-float-positive-infinity");

string('n = n);
''(if is_sbcl then "n = #<DOUBLE-FLOAT quiet NaN>"
   elseif is_gcl then "n = #<nan>");

string('minusi = minusi);
''(if is_sbcl then "minusi = #.SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY"
   elseif is_gcl then "minusi = #<-inf>"
   elseif is_ecl then "minusi = #.ext::double-float-negative-infinity");

/* SF bug report #2680: "1000!^0.01 gives i.nfE+6166368" */
errcatch (string (1000!^0.01));
''(if is_sbcl then ["#.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY"]
   elseif is_gcl then ["#<inf>"]
   elseif is_ecl then ["#.ext::double-float-positive-infinity"]);

/* SF bug report #2749: "Float evaluation of sinh causes Lisp error instead of overflowing to bigfloat" */

errcatch(string(sinh(1e3)));
''(if is_sbcl then ["#.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY"]
   elseif is_gcl then ["#<inf>"]
   elseif is_ecl then ["#.ext::double-float-positive-infinity"]);

errcatch(string(cosh(1e3)));
''(if is_sbcl then ["#.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY"]
   elseif is_gcl then ["#<inf>"]
   elseif is_ecl then ["#.ext::double-float-positive-infinity"]);

/* SF bug report #3081: abs(...) -> "bfloat: attempted conversion of floating-point infinity." */

[abs(%e^(10000/3)+1), abs(%e^10000+1), abs(%e^(10000/3))];
[abs(%e^(10000/3)+1), abs(%e^10000+1), abs(%e^(10000/3))];

errcatch(string(ev(exp(10000/3),numer)));
''(if is_sbcl then ["#.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY"]
   elseif is_gcl then ["#<inf>"]
   elseif is_ecl then ["#.ext::double-float-positive-infinity"]);

errcatch(string(ev(exp(10000/3),numer,%enumer)));
''(if is_sbcl then ["#.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY"]
   elseif is_gcl then ["#<inf>"]
   elseif is_ecl then ["#.ext::double-float-positive-infinity"]);