1 ## oils_failures_allowed: 0
2
3 #### Float Literals with e-1
4
5 shopt -s ysh:upgrade
6 # 1+2 2.3
7 var x = 1.2 + 23.0e-1 # 3.5
8 if (3.4 < x and x < 3.6) {
9 echo ok
10 }
11 ## STDOUT:
12 ok
13 ## END
14
15 #### Float Literal with _
16
17 shopt -s ysh:upgrade
18
19 # 1+2 + 2.3
20 # add this _ here
21 var x = 1.2 + 2_3.0e-1 # 3.5
22 if (3.4 < x and x < 3.6) {
23 echo ok
24 }
25
26 ## STDOUT:
27 ok
28 ## END
29
30
31 #### Period requires digit on either side, not 5. or .5
32 shopt --set parse_ysh_expr_sub
33
34 echo $[0.5]
35 echo $[5.0]
36 echo $[5.]
37 echo $[.5]
38
39 ## status: 2
40 ## STDOUT:
41 0.5
42 5.0
43 ## END
44
45 #### Big float Literals with _
46 shopt --set parse_ysh_expr_sub
47
48 # C++ issue: we currently print with snprintf %g
49 # Pars
50
51 echo $[42_000.000_500]
52
53 echo $[42_000.000_500e1]
54 echo $[42_000.000_500e-1]
55
56 ## STDOUT:
57 42000.0005
58 420000.005
59 4200.00005
60 ## END
61
62 #### Big floats like 1e309 and -1e309 go to Inf / -Inf
63 shopt --set parse_ysh_expr_sub
64
65 # Notes
66 # - Python float() and JS parseFloat() agree with this behavior
67 # - JSON doesn't have inf / -inf
68
69 echo $[1e309]
70 echo $[-1e309]
71
72 ## STDOUT:
73 inf
74 -inf
75 ## END
76
77 #### Tiny floats go to zero
78
79 shopt -s ysh:upgrade
80 # TODO: need equivalent of in YSh
81 # '0' * 309
82 # ['0'] * 309
83
84 # 1e-324 == 0.0 in Python
85
86 var zeros = []
87 for i in (1 ..< 324) {
88 call zeros->append('0')
89 }
90
91 #= zeros
92
93 var s = "0.$[join(zeros)]1"
94 #echo $s
95
96 echo float=$[float(s)]
97
98 ## STDOUT:
99 float=0.0
100 ## END
101
102
103 #### floatEquals() INFINITY NAN
104
105 shopt --set ysh:upgrade
106 source $LIB_YSH/list.ysh
107
108 # Create inf
109 var big = repeat('12345678', 100) ++ '.0'
110
111 var inf = fromJson(big)
112 var neg_inf = fromJson('-' ++ big)
113
114 if (floatsEqual(inf, INFINITY)) {
115 echo inf
116 }
117
118 if (floatsEqual(neg_inf, -INFINITY)) {
119 echo neg_inf
120 }
121
122 if (floatsEqual(NAN, INFINITY)) {
123 echo bad
124 }
125
126 if (floatsEqual(NAN, NAN)) {
127 echo bad
128 }
129
130 if (not floatsEqual(NAN, NAN)) {
131 echo 'nan is not nan'
132 }
133
134 ## STDOUT:
135 inf
136 neg_inf
137 nan is not nan
138 ## END
139
140 #### pretty print INFINITY, -INFINITY, NAN
141
142 = [INFINITY, -INFINITY, NAN]
143 pp test_ ([INFINITY, -INFINITY, NAN])
144
145 ## STDOUT:
146 (List) [INFINITY, -INFINITY, NAN]
147 (List) [INFINITY,-INFINITY,NAN]
148 ## END
149
150 #### can't convert NAN, INFINITY to integer
151 shopt --set ysh:upgrade
152
153 #echo $[int(NAN)]
154 try {
155 echo $[int(NAN)]
156 }
157 echo code $[_error.code]
158 #pp test_ (_error)
159
160 #echo $[int(-INFINITY)]
161 try {
162 echo $[int(-INFINITY)]
163 }
164 echo code $[_error.code]
165 #pp test_ (_error)
166
167 ## STDOUT:
168 code 3
169 code 3
170 ## END
171
172 #### Regression: 1/3 gives 0.3+
173
174 # We were using float precision, not double
175
176 shopt --set ysh:upgrade
177
178 pp test_ (1/3) | read --all
179 if (_reply ~ / '0.' '3'+ / ) {
180 echo one-third
181 }
182
183 pp test_ (2/3) | read --all
184 #pp test_ (_reply)
185 if (_reply ~ / '0.' '6'+ / ) {
186 echo two-thirds
187 }
188
189 ## STDOUT:
190 one-third
191 two-thirds
192 ## END
193
194 #### Number of digits in 1/3
195 shopt --set ysh:upgrade
196
197 # - Python 2 and bin/ysh: 14
198 # - Python 3: 18
199 # - YSH C++: 18
200
201 var s = str(1/3)
202 #echo "ysh len $[len(s)]"
203 #echo ysh=$s
204
205 # Don't bother to distinguish OSH Python vs C++ here
206 case (len(s)) {
207 (14) { echo pass }
208 (18) { echo pass }
209 (else) { echo FAIL }
210 }
211
212 exit
213
214 var py2 = $(python2 -c 'print(1.0/3)')
215 echo "py2 len $[len(py2)]"
216 echo py2=$py2
217
218 var py3 = $(python3 -c 'print(1/3)')
219 echo "py3 len $[len(py3)]"
220 echo py3=$py3
221
222 ## STDOUT:
223 pass
224 ## END