File: numeric.html

package info (click to toggle)
hugs 1.4.199801-1
  • links: PTS
  • area: non-free
  • in suites: slink
  • size: 7,220 kB
  • ctags: 5,609
  • sloc: ansic: 32,083; haskell: 12,143; yacc: 949; perl: 823; sh: 602; makefile: 236
file content (354 lines) | stat: -rw-r--r-- 42,695 bytes parent folder | download
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354

<title>The Haskell 1.3 Library Report: Numerics</title>
<body bgcolor="#ffffff"> <i>The Haskell 1.4 Library Report</i><br> <a href="index.html">top</a> | <a href="complex.html">back</a> | <a href="ix.html">next</a> | <a href="libindex.html">contents</a> <br><hr>
<a name="lib-numeric"></a><a name="sect4"></a>
<h2>4<tt>&nbsp;&nbsp;</tt>Numeric</h2>
<p>
<table border=2 cellpadding=3>
<tr><td>
<tt><br>
module&nbsp;Numeric(fromRat,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showSigned,&nbsp;showInt,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readSigned,&nbsp;readInt,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readDec,&nbsp;readOct,&nbsp;readHex,&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;floatToDigits,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showEFloat,&nbsp;showFFloat,&nbsp;showGFloat,&nbsp;showFloat,&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readFloat,&nbsp;lexDigits)<br>
<br>
fromRat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Rational&nbsp;-&gt;&nbsp;a<br>
showSigned&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(Real&nbsp;a)&nbsp;=&gt;&nbsp;(a&nbsp;-&gt;&nbsp;ShowS)&nbsp;-&gt;&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showInt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;Integral&nbsp;a&nbsp;=&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
readSigned&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(Real&nbsp;a)&nbsp;=&gt;&nbsp;ReadS&nbsp;a&nbsp;-&gt;&nbsp;ReadS&nbsp;a<br>
readInt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(Integral&nbsp;a)&nbsp;=&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;-&gt;&nbsp;(Char&nbsp;-&gt;&nbsp;Bool)&nbsp;-&gt;&nbsp;(Char&nbsp;-&gt;&nbsp;Int)&nbsp;-&gt;&nbsp;ReadS&nbsp;a<br>
readDec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(Integral&nbsp;a)&nbsp;=&gt;&nbsp;ReadS&nbsp;a<br>
readOct&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(Integral&nbsp;a)&nbsp;=&gt;&nbsp;ReadS&nbsp;a<br>
readHex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(Integral&nbsp;a)&nbsp;=&gt;&nbsp;ReadS&nbsp;a<br>
<br>
showEFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Maybe&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showFFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Maybe&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showGFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Maybe&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
<br>
floatToDigits&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Integer&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;([Int],&nbsp;Int)<br>
<br>
readFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;ReadS&nbsp;a<br>
lexDigits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;ReadS&nbsp;String&nbsp;<br>

</tt></td></tr></table>

This library contains assorted numeric functions, many of which are
used in the standard Prelude.  Most are
self-explanatory.  The <tt>floatToDigits</tt> function converts a floating
point value into a series of digits and an exponent of a selected
base.  This is used to build a set of floating point formatting
functions.<p>
<a name="sect4.1"></a>
<h3>4.1<tt>&nbsp;&nbsp;</tt>Library <tt>Numeric</tt></h3>
<tt><br>
module&nbsp;Numeric(fromRat,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showSigned,&nbsp;showInt,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readSigned,&nbsp;readInt,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readDec,&nbsp;readOct,&nbsp;readHex,&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;floatToDigits,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showEFloat,&nbsp;showFFloat,&nbsp;showGFloat,&nbsp;showFloat,&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readFloat,&nbsp;lexDigits)&nbsp;where<br>
<br>
import&nbsp;Char<br>
import&nbsp;Array<br>
<br>
--&nbsp;This&nbsp;converts&nbsp;a&nbsp;rational&nbsp;to&nbsp;a&nbsp;floating.&nbsp;&nbsp;This&nbsp;should&nbsp;be&nbsp;used&nbsp;in&nbsp;the<br>
--&nbsp;Fractional&nbsp;instances&nbsp;of&nbsp;Float&nbsp;and&nbsp;Double.<br>
<br>
fromRat&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Rational&nbsp;-&gt;&nbsp;a<br>
fromRat&nbsp;x&nbsp;=&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;x&nbsp;==&nbsp;0&nbsp;then&nbsp;encodeFloat&nbsp;0&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;Handle&nbsp;exceptional&nbsp;cases<br>
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;x&nbsp;&lt;&nbsp;0&nbsp;then&nbsp;-&nbsp;fromRat'&nbsp;(-x)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;first.<br>
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;fromRat'&nbsp;x<br>
<br>
--&nbsp;Conversion&nbsp;process:<br>
--&nbsp;Scale&nbsp;the&nbsp;rational&nbsp;number&nbsp;by&nbsp;the&nbsp;RealFloat&nbsp;base&nbsp;until<br>
--&nbsp;it&nbsp;lies&nbsp;in&nbsp;the&nbsp;range&nbsp;of&nbsp;the&nbsp;mantissa&nbsp;(as&nbsp;used&nbsp;by&nbsp;decodeFloat/encodeFloat).<br>
--&nbsp;Then&nbsp;round&nbsp;the&nbsp;rational&nbsp;to&nbsp;an&nbsp;Integer&nbsp;and&nbsp;encode&nbsp;it&nbsp;with&nbsp;the&nbsp;exponent<br>
--&nbsp;that&nbsp;we&nbsp;got&nbsp;from&nbsp;the&nbsp;scaling.<br>
--&nbsp;To&nbsp;speed&nbsp;up&nbsp;the&nbsp;scaling&nbsp;process&nbsp;we&nbsp;compute&nbsp;the&nbsp;log2&nbsp;of&nbsp;the&nbsp;number&nbsp;to&nbsp;get<br>
--&nbsp;a&nbsp;first&nbsp;guess&nbsp;of&nbsp;the&nbsp;exponent.<br>
fromRat'&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Rational&nbsp;-&gt;&nbsp;a<br>
fromRat'&nbsp;x&nbsp;=&nbsp;r<br>
&nbsp;&nbsp;where&nbsp;b&nbsp;=&nbsp;floatRadix&nbsp;r<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;floatDigits&nbsp;r<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(minExp0,&nbsp;_)&nbsp;=&nbsp;floatRange&nbsp;r<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minExp&nbsp;=&nbsp;minExp0&nbsp;-&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;the&nbsp;real&nbsp;minimum&nbsp;exponent<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xMin&nbsp;=&nbsp;toRational&nbsp;(expt&nbsp;b&nbsp;(p-1))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xMax&nbsp;=&nbsp;toRational&nbsp;(expt&nbsp;b&nbsp;p)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p0&nbsp;=&nbsp;(integerLogBase&nbsp;b&nbsp;(numerator&nbsp;x)&nbsp;-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;integerLogBase&nbsp;b&nbsp;(denominator&nbsp;x)&nbsp;-&nbsp;p)&nbsp;`max`&nbsp;minExp<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;if&nbsp;p0&nbsp;&lt;&nbsp;0&nbsp;then&nbsp;1&nbsp;%&nbsp;expt&nbsp;b&nbsp;(-p0)&nbsp;else&nbsp;expt&nbsp;b&nbsp;p0&nbsp;%&nbsp;1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(x',&nbsp;p')&nbsp;=&nbsp;scaleRat&nbsp;(toRational&nbsp;b)&nbsp;minExp&nbsp;xMin&nbsp;xMax&nbsp;p0&nbsp;(x&nbsp;/&nbsp;f)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;encodeFloat&nbsp;(round&nbsp;x')&nbsp;p'<br>
<br>
--&nbsp;Scale&nbsp;x&nbsp;until&nbsp;xMin&nbsp;&lt;=&nbsp;x&nbsp;&lt;&nbsp;xMax,&nbsp;or&nbsp;p&nbsp;(the&nbsp;exponent)&nbsp;&lt;=&nbsp;minExp.<br>
scaleRat&nbsp;::&nbsp;Rational&nbsp;-&gt;&nbsp;Int&nbsp;-&gt;&nbsp;Rational&nbsp;-&gt;&nbsp;Rational&nbsp;-&gt;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Int&nbsp;-&gt;&nbsp;Rational&nbsp;-&gt;&nbsp;(Rational,&nbsp;Int)<br>
scaleRat&nbsp;b&nbsp;minExp&nbsp;xMin&nbsp;xMax&nbsp;p&nbsp;x&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;p&nbsp;&lt;=&nbsp;minExp&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(x,&nbsp;p)<br>
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;x&nbsp;&gt;=&nbsp;xMax&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scaleRat&nbsp;b&nbsp;minExp&nbsp;xMin&nbsp;xMax&nbsp;(p+1)&nbsp;(x/b)<br>
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;x&nbsp;&lt;&nbsp;xMin&nbsp;&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scaleRat&nbsp;b&nbsp;minExp&nbsp;xMin&nbsp;xMax&nbsp;(p-1)&nbsp;(x*b)<br>
&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(x,&nbsp;p)<br>
<br>
--&nbsp;Exponentiation&nbsp;with&nbsp;a&nbsp;cache&nbsp;for&nbsp;the&nbsp;most&nbsp;common&nbsp;numbers.<br>
minExpt&nbsp;=&nbsp;0::Int<br>
maxExpt&nbsp;=&nbsp;1100::Int<br>
expt&nbsp;::&nbsp;Integer&nbsp;-&gt;&nbsp;Int&nbsp;-&gt;&nbsp;Integer<br>
expt&nbsp;base&nbsp;n&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;base&nbsp;==&nbsp;2&nbsp;&amp;&amp;&nbsp;n&nbsp;&gt;=&nbsp;minExpt&nbsp;&amp;&amp;&nbsp;n&nbsp;&lt;=&nbsp;maxExpt&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expts!n<br>
&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base^n<br>
<br>
expts&nbsp;::&nbsp;Array&nbsp;Int&nbsp;Integer<br>
expts&nbsp;=&nbsp;array&nbsp;(minExpt,maxExpt)&nbsp;[(n,2^n)&nbsp;|&nbsp;n&nbsp;&lt;-&nbsp;[minExpt&nbsp;..&nbsp;maxExpt]]<br>
<br>
--&nbsp;Compute&nbsp;the&nbsp;(floor&nbsp;of&nbsp;the)&nbsp;log&nbsp;of&nbsp;i&nbsp;in&nbsp;base&nbsp;b.<br>
--&nbsp;Simplest&nbsp;way&nbsp;would&nbsp;be&nbsp;just&nbsp;divide&nbsp;i&nbsp;by&nbsp;b&nbsp;until&nbsp;it's&nbsp;smaller&nbsp;then&nbsp;b,<br>
--&nbsp;but&nbsp;that&nbsp;would&nbsp;be&nbsp;very&nbsp;slow!&nbsp;&nbsp;We&nbsp;are&nbsp;just&nbsp;slightly&nbsp;more&nbsp;clever.<br>
integerLogBase&nbsp;::&nbsp;Integer&nbsp;-&gt;&nbsp;Integer&nbsp;-&gt;&nbsp;Int<br>
integerLogBase&nbsp;b&nbsp;i&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i&nbsp;&lt;&nbsp;b&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;Try&nbsp;squaring&nbsp;the&nbsp;base&nbsp;first&nbsp;to&nbsp;cut&nbsp;down&nbsp;the&nbsp;number&nbsp;of&nbsp;divisions.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;l&nbsp;=&nbsp;2&nbsp;*&nbsp;integerLogBase&nbsp;(b*b)&nbsp;i<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doDiv&nbsp;::&nbsp;Integer&nbsp;-&gt;&nbsp;Int&nbsp;-&gt;&nbsp;Int<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doDiv&nbsp;i&nbsp;l&nbsp;=&nbsp;if&nbsp;i&nbsp;&lt;&nbsp;b&nbsp;then&nbsp;l&nbsp;else&nbsp;doDiv&nbsp;(i&nbsp;`div`&nbsp;b)&nbsp;(l+1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;doDiv&nbsp;(i&nbsp;`div`&nbsp;(b^l))&nbsp;l<br>
<br>
<br>
--&nbsp;Misc&nbsp;utilities&nbsp;to&nbsp;show&nbsp;integers&nbsp;and&nbsp;floats&nbsp;<br>
<br>
showSigned&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;Real&nbsp;a&nbsp;=&gt;&nbsp;(a&nbsp;-&gt;&nbsp;ShowS)&nbsp;-&gt;&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showSigned&nbsp;showPos&nbsp;p&nbsp;x&nbsp;|&nbsp;x&nbsp;&lt;&nbsp;0&nbsp;=&nbsp;showParen&nbsp;(p&nbsp;&gt;&nbsp;6)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(showChar&nbsp;'-'&nbsp;.&nbsp;showPos&nbsp;(-x))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;otherwise&nbsp;=&nbsp;showPos&nbsp;x<br>
<br>
--&nbsp;showInt&nbsp;is&nbsp;used&nbsp;for&nbsp;positive&nbsp;numbers&nbsp;only<br>
showInt&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;Integral&nbsp;a&nbsp;=&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showInt&nbsp;n&nbsp;r&nbsp;|&nbsp;n&nbsp;&lt;&nbsp;0&nbsp;=&nbsp;error&nbsp;"Numeric.showInt:&nbsp;can't&nbsp;show&nbsp;negative&nbsp;numbers"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;otherwise&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;(n',d)&nbsp;=&nbsp;quotRem&nbsp;n&nbsp;10<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;toEnum&nbsp;(fromEnum&nbsp;'0'&nbsp;+&nbsp;fromIntegral&nbsp;d)&nbsp;:&nbsp;r<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;if&nbsp;n'&nbsp;==&nbsp;0&nbsp;then&nbsp;r'&nbsp;else&nbsp;showInt&nbsp;n'&nbsp;r'<br>
<br>
<br>
readSigned&nbsp;::&nbsp;(Real&nbsp;a)&nbsp;=&gt;&nbsp;ReadS&nbsp;a&nbsp;-&gt;&nbsp;ReadS&nbsp;a<br>
readSigned&nbsp;readPos&nbsp;=&nbsp;readParen&nbsp;False&nbsp;read'<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;read'&nbsp;r&nbsp;&nbsp;=&nbsp;read''&nbsp;r&nbsp;++<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(-x,t)&nbsp;|&nbsp;("-",s)&nbsp;&lt;-&nbsp;lex&nbsp;r,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(x,t)&nbsp;&nbsp;&nbsp;&lt;-&nbsp;read''&nbsp;s]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read''&nbsp;r&nbsp;=&nbsp;[(n,s)&nbsp;&nbsp;|&nbsp;(str,s)&nbsp;&lt;-&nbsp;lex&nbsp;r,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(n,"")&nbsp;&nbsp;&lt;-&nbsp;readPos&nbsp;str]<br>
<br>
<br>
--&nbsp;readInt&nbsp;reads&nbsp;a&nbsp;string&nbsp;of&nbsp;digits&nbsp;using&nbsp;an&nbsp;arbitrary&nbsp;base.&nbsp;&nbsp;<br>
--&nbsp;Leading&nbsp;minus&nbsp;signs&nbsp;must&nbsp;be&nbsp;handled&nbsp;elsewhere.<br>
<br>
readInt&nbsp;::&nbsp;(Integral&nbsp;a)&nbsp;=&gt;&nbsp;a&nbsp;-&gt;&nbsp;(Char&nbsp;-&gt;&nbsp;Bool)&nbsp;-&gt;&nbsp;(Char&nbsp;-&gt;&nbsp;Int)&nbsp;-&gt;&nbsp;ReadS&nbsp;a<br>
readInt&nbsp;radix&nbsp;isDig&nbsp;digToInt&nbsp;s&nbsp;=<br>
&nbsp;&nbsp;&nbsp;[(foldl1&nbsp;(\n&nbsp;d&nbsp;-&gt;&nbsp;n&nbsp;*&nbsp;radix&nbsp;+&nbsp;d)&nbsp;(map&nbsp;(fromIntegral&nbsp;.&nbsp;digToInt)&nbsp;ds),&nbsp;r)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;(ds,r)&nbsp;&lt;-&nbsp;nonnull&nbsp;isDig&nbsp;s&nbsp;]<br>
<br>
--&nbsp;Unsigned&nbsp;readers&nbsp;for&nbsp;various&nbsp;bases<br>
readDec,&nbsp;readOct,&nbsp;readHex&nbsp;::&nbsp;(Integral&nbsp;a)&nbsp;=&gt;&nbsp;ReadS&nbsp;a<br>
readDec&nbsp;=&nbsp;readInt&nbsp;10&nbsp;isDigit&nbsp;digitToInt<br>
readOct&nbsp;=&nbsp;readInt&nbsp;&nbsp;8&nbsp;isOctDigit&nbsp;digitToInt<br>
readHex&nbsp;=&nbsp;readInt&nbsp;16&nbsp;isHexDigit&nbsp;digitToInt<br>
<br>
<br>
showEFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Maybe&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showFFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Maybe&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showGFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Maybe&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
showFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;a&nbsp;-&gt;&nbsp;ShowS<br>
<br>
showEFloat&nbsp;d&nbsp;x&nbsp;=&nbsp;&nbsp;showString&nbsp;(formatRealFloat&nbsp;FFExponent&nbsp;d&nbsp;x)<br>
showFFloat&nbsp;d&nbsp;x&nbsp;=&nbsp;&nbsp;showString&nbsp;(formatRealFloat&nbsp;FFFixed&nbsp;d&nbsp;x)<br>
showGFloat&nbsp;d&nbsp;x&nbsp;=&nbsp;&nbsp;showString&nbsp;(formatRealFloat&nbsp;FFGeneric&nbsp;d&nbsp;x)<br>
showFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;showGFloat&nbsp;Nothing&nbsp;<br>
<br>
--&nbsp;These&nbsp;are&nbsp;the&nbsp;format&nbsp;types.&nbsp;&nbsp;This&nbsp;type&nbsp;is&nbsp;not&nbsp;exported.<br>
<br>
data&nbsp;FFFormat&nbsp;=&nbsp;FFExponent&nbsp;|&nbsp;FFFixed&nbsp;|&nbsp;FFGeneric<br>
<br>
formatRealFloat&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;FFFormat&nbsp;-&gt;&nbsp;Maybe&nbsp;Int&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;String<br>
formatRealFloat&nbsp;fmt&nbsp;decs&nbsp;x&nbsp;=&nbsp;s<br>
&nbsp;&nbsp;where&nbsp;base&nbsp;=&nbsp;10<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;if&nbsp;isNaN&nbsp;x&nbsp;then&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"NaN"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;isInfinite&nbsp;x&nbsp;then&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;x&nbsp;&lt;&nbsp;0&nbsp;then&nbsp;"-Infinity"&nbsp;else&nbsp;"Infinity"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;x&nbsp;&lt;&nbsp;0&nbsp;||&nbsp;isNegativeZero&nbsp;x&nbsp;then&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-'&nbsp;:&nbsp;doFmt&nbsp;fmt&nbsp;(floatToDigits&nbsp;(toInteger&nbsp;base)&nbsp;(-x))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doFmt&nbsp;fmt&nbsp;(floatToDigits&nbsp;(toInteger&nbsp;base)&nbsp;x)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doFmt&nbsp;fmt&nbsp;(is,&nbsp;e)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;ds&nbsp;=&nbsp;map&nbsp;intToDigit&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;case&nbsp;fmt&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FFGeneric&nbsp;-&gt;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doFmt&nbsp;(if&nbsp;e&nbsp;&lt;&nbsp;0&nbsp;||&nbsp;e&nbsp;&gt;&nbsp;7&nbsp;then&nbsp;FFExponent&nbsp;else&nbsp;FFFixed)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(is,&nbsp;e)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FFExponent&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;decs&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nothing&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ds&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;['0']&nbsp;-&gt;&nbsp;"0.0e0"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[d]&nbsp;&nbsp;&nbsp;-&gt;&nbsp;d&nbsp;:&nbsp;".0e"&nbsp;++&nbsp;show&nbsp;(e-1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d:ds&nbsp;&nbsp;-&gt;&nbsp;d&nbsp;:&nbsp;'.'&nbsp;:&nbsp;ds&nbsp;++&nbsp;'e':show&nbsp;(e-1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Just&nbsp;dec&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;dec'&nbsp;=&nbsp;max&nbsp;dec&nbsp;1&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;is&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;-&gt;&nbsp;'0':'.':take&nbsp;dec'&nbsp;(repeat&nbsp;'0')&nbsp;++&nbsp;"e0"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;(ei,&nbsp;is')&nbsp;=&nbsp;roundTo&nbsp;base&nbsp;(dec'+1)&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d:ds&nbsp;=&nbsp;map&nbsp;intToDigit<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;ei&nbsp;&gt;&nbsp;0&nbsp;then&nbsp;init&nbsp;is'&nbsp;else&nbsp;is')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;d:'.':ds&nbsp;&nbsp;++&nbsp;"e"&nbsp;++&nbsp;show&nbsp;(e-1+ei)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FFFixed&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;decs&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nothing&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;f&nbsp;0&nbsp;s&nbsp;ds&nbsp;=&nbsp;mk0&nbsp;s&nbsp;++&nbsp;"."&nbsp;++&nbsp;mk0&nbsp;ds<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;n&nbsp;s&nbsp;""&nbsp;=&nbsp;f&nbsp;(n-1)&nbsp;(s++"0")&nbsp;""<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;n&nbsp;s&nbsp;(d:ds)&nbsp;=&nbsp;f&nbsp;(n-1)&nbsp;(s++[d])&nbsp;ds<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mk0&nbsp;""&nbsp;=&nbsp;"0"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mk0&nbsp;s&nbsp;=&nbsp;s<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;f&nbsp;e&nbsp;""&nbsp;ds<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Just&nbsp;dec&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;dec'&nbsp;=&nbsp;max&nbsp;dec&nbsp;0&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;e&nbsp;&gt;=&nbsp;0&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;(ei,&nbsp;is')&nbsp;=&nbsp;roundTo&nbsp;base&nbsp;(dec'&nbsp;+&nbsp;e)&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ls,&nbsp;rs)&nbsp;=&nbsp;splitAt&nbsp;(e+ei)&nbsp;(map&nbsp;intToDigit&nbsp;is')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;(if&nbsp;null&nbsp;ls&nbsp;then&nbsp;"0"&nbsp;else&nbsp;ls)&nbsp;++&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;null&nbsp;rs&nbsp;then&nbsp;""&nbsp;else&nbsp;'.'&nbsp;:&nbsp;rs)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;(ei,&nbsp;is')&nbsp;=&nbsp;roundTo&nbsp;base&nbsp;dec'<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(replicate&nbsp;(-e)&nbsp;0&nbsp;++&nbsp;is)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;:&nbsp;ds&nbsp;=&nbsp;map&nbsp;intToDigit<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;ei&nbsp;&gt;&nbsp;0&nbsp;then&nbsp;is'&nbsp;else&nbsp;0:is')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;d&nbsp;:&nbsp;'.'&nbsp;:&nbsp;ds<br>
<br>
roundTo&nbsp;::&nbsp;Int&nbsp;-&gt;&nbsp;Int&nbsp;-&gt;&nbsp;[Int]&nbsp;-&gt;&nbsp;(Int,&nbsp;[Int])<br>
roundTo&nbsp;base&nbsp;d&nbsp;is&nbsp;=&nbsp;case&nbsp;f&nbsp;d&nbsp;is&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0,&nbsp;is)&nbsp;-&gt;&nbsp;(0,&nbsp;is)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1,&nbsp;is)&nbsp;-&gt;&nbsp;(1,&nbsp;1&nbsp;:&nbsp;is)<br>
&nbsp;&nbsp;where&nbsp;b2&nbsp;=&nbsp;base&nbsp;`div`&nbsp;2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;n&nbsp;[]&nbsp;=&nbsp;(0,&nbsp;replicate&nbsp;n&nbsp;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;0&nbsp;(i:_)&nbsp;=&nbsp;(if&nbsp;i&nbsp;&gt;=&nbsp;b2&nbsp;then&nbsp;1&nbsp;else&nbsp;0,&nbsp;[])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;d&nbsp;(i:is)&nbsp;=&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;(c,&nbsp;ds)&nbsp;=&nbsp;f&nbsp;(d-1)&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i'&nbsp;=&nbsp;c&nbsp;+&nbsp;i<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;if&nbsp;i'&nbsp;==&nbsp;base&nbsp;then&nbsp;(1,&nbsp;0:ds)&nbsp;else&nbsp;(0,&nbsp;i':ds)<br>
<br>
--<br>
--&nbsp;Based&nbsp;on&nbsp;"Printing&nbsp;Floating-Point&nbsp;Numbers&nbsp;Quickly&nbsp;and&nbsp;Accurately"<br>
--&nbsp;by&nbsp;R.G.&nbsp;Burger&nbsp;and&nbsp;R.&nbsp;K.&nbsp;Dybvig,&nbsp;in&nbsp;PLDI&nbsp;96.<br>
--&nbsp;This&nbsp;version&nbsp;uses&nbsp;a&nbsp;much&nbsp;slower&nbsp;logarithm&nbsp;estimator.&nbsp;&nbsp;It&nbsp;should&nbsp;be&nbsp;improved.<br>
<br>
--&nbsp;This&nbsp;function&nbsp;returns&nbsp;a&nbsp;list&nbsp;of&nbsp;digits&nbsp;(Ints&nbsp;in&nbsp;[0..base-1])&nbsp;and&nbsp;an<br>
--&nbsp;exponent.<br>
<br>
floatToDigits&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;Integer&nbsp;-&gt;&nbsp;a&nbsp;-&gt;&nbsp;([Int],&nbsp;Int)<br>
<br>
floatToDigits&nbsp;_&nbsp;0&nbsp;=&nbsp;([0],&nbsp;0)<br>
floatToDigits&nbsp;base&nbsp;x&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;(f0,&nbsp;e0)&nbsp;=&nbsp;decodeFloat&nbsp;x<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(minExp0,&nbsp;_)&nbsp;=&nbsp;floatRange&nbsp;x<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;floatDigits&nbsp;x<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;floatRadix&nbsp;x<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minExp&nbsp;=&nbsp;minExp0&nbsp;-&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;the&nbsp;real&nbsp;minimum&nbsp;exponent<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;Haskell&nbsp;requires&nbsp;that&nbsp;f&nbsp;be&nbsp;adjusted&nbsp;so&nbsp;denormalized&nbsp;numbers<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;will&nbsp;have&nbsp;an&nbsp;impossibly&nbsp;low&nbsp;exponent.&nbsp;&nbsp;Adjust&nbsp;for&nbsp;this.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f,&nbsp;e)&nbsp;=&nbsp;let&nbsp;n&nbsp;=&nbsp;minExp&nbsp;-&nbsp;e0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;if&nbsp;n&nbsp;&gt;&nbsp;0&nbsp;then&nbsp;(f0&nbsp;`div`&nbsp;(b^n),&nbsp;e0+n)&nbsp;else&nbsp;(f0,&nbsp;e0)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(r,&nbsp;s,&nbsp;mUp,&nbsp;mDn)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;e&nbsp;&gt;=&nbsp;0&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;be&nbsp;=&nbsp;b^e&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;f&nbsp;==&nbsp;b^(p-1)&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f*be*b*2,&nbsp;2*b,&nbsp;be*b,&nbsp;b)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f*be*2,&nbsp;2,&nbsp;be,&nbsp;be)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;e&nbsp;&gt;&nbsp;minExp&nbsp;&amp;&amp;&nbsp;f&nbsp;==&nbsp;b^(p-1)&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f*b*2,&nbsp;b^(-e+1)*2,&nbsp;b,&nbsp;1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f*2,&nbsp;b^(-e)*2,&nbsp;1,&nbsp;1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;k0&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;b==2&nbsp;&amp;&amp;&nbsp;base==10&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;logBase&nbsp;10&nbsp;2&nbsp;is&nbsp;slightly&nbsp;bigger&nbsp;than&nbsp;3/10&nbsp;so<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;the&nbsp;following&nbsp;will&nbsp;err&nbsp;on&nbsp;the&nbsp;low&nbsp;side.&nbsp;&nbsp;Ignoring<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;the&nbsp;fraction&nbsp;will&nbsp;make&nbsp;it&nbsp;err&nbsp;even&nbsp;more.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;Haskell&nbsp;promises&nbsp;that&nbsp;p-1&nbsp;&lt;=&nbsp;logBase&nbsp;b&nbsp;f&nbsp;&lt;&nbsp;p.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p&nbsp;-&nbsp;1&nbsp;+&nbsp;e0)&nbsp;*&nbsp;3&nbsp;`div`&nbsp;10<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ceiling&nbsp;((log&nbsp;(fromInteger&nbsp;(f+1))&nbsp;+&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fromInt&nbsp;e&nbsp;*&nbsp;log&nbsp;(fromInteger&nbsp;b))&nbsp;/&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log&nbsp;(fromInteger&nbsp;base))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixup&nbsp;n&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;n&nbsp;&gt;=&nbsp;0&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;r&nbsp;+&nbsp;mUp&nbsp;&lt;=&nbsp;expt&nbsp;base&nbsp;n&nbsp;*&nbsp;s&nbsp;then&nbsp;n&nbsp;else&nbsp;fixup&nbsp;(n+1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;expt&nbsp;base&nbsp;(-n)&nbsp;*&nbsp;(r&nbsp;+&nbsp;mUp)&nbsp;&lt;=&nbsp;s&nbsp;then&nbsp;n<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;fixup&nbsp;(n+1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;fixup&nbsp;k0<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gen&nbsp;ds&nbsp;rn&nbsp;sN&nbsp;mUpN&nbsp;mDnN&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;(dn,&nbsp;rn')&nbsp;=&nbsp;(rn&nbsp;*&nbsp;base)&nbsp;`divMod`&nbsp;sN<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mUpN'&nbsp;=&nbsp;mUpN&nbsp;*&nbsp;base<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDnN'&nbsp;=&nbsp;mDnN&nbsp;*&nbsp;base<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;case&nbsp;(rn'&nbsp;&lt;&nbsp;mDnN',&nbsp;rn'&nbsp;+&nbsp;mUpN'&nbsp;&gt;&nbsp;sN)&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(True,&nbsp;&nbsp;False)&nbsp;-&gt;&nbsp;dn&nbsp;:&nbsp;ds<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(False,&nbsp;True)&nbsp;&nbsp;-&gt;&nbsp;dn+1&nbsp;:&nbsp;ds<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(True,&nbsp;&nbsp;True)&nbsp;&nbsp;-&gt;&nbsp;if&nbsp;rn'&nbsp;*&nbsp;2&nbsp;&lt;&nbsp;sN&nbsp;then&nbsp;dn&nbsp;:&nbsp;ds&nbsp;else&nbsp;dn+1&nbsp;:&nbsp;ds<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(False,&nbsp;False)&nbsp;-&gt;&nbsp;gen&nbsp;(dn:ds)&nbsp;rn'&nbsp;sN&nbsp;mUpN'&nbsp;mDnN'<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rds&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;k&nbsp;&gt;=&nbsp;0&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gen&nbsp;[]&nbsp;r&nbsp;(s&nbsp;*&nbsp;expt&nbsp;base&nbsp;k)&nbsp;mUp&nbsp;mDn<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;bk&nbsp;=&nbsp;expt&nbsp;base&nbsp;(-k)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;gen&nbsp;[]&nbsp;(r&nbsp;*&nbsp;bk)&nbsp;s&nbsp;(mUp&nbsp;*&nbsp;bk)&nbsp;(mDn&nbsp;*&nbsp;bk)<br>
&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;(map&nbsp;toInt&nbsp;(reverse&nbsp;rds),&nbsp;k)<br>
<br>
<br>
<br>
--&nbsp;This&nbsp;floating&nbsp;point&nbsp;reader&nbsp;uses&nbsp;a&nbsp;less&nbsp;restrictive&nbsp;syntax&nbsp;for&nbsp;floating<br>
--&nbsp;point&nbsp;than&nbsp;the&nbsp;Haskell&nbsp;lexer.&nbsp;&nbsp;The&nbsp;`.'&nbsp;is&nbsp;optional.<br>
<br>
readFloat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(RealFloat&nbsp;a)&nbsp;=&gt;&nbsp;ReadS&nbsp;a<br>
readFloat&nbsp;r&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;[(fromRational&nbsp;((n%1)*10^^(k-d)),t)&nbsp;|&nbsp;(n,d,s)&nbsp;&lt;-&nbsp;readFix&nbsp;r,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(k,t)&nbsp;&nbsp;&nbsp;&lt;-&nbsp;readExp&nbsp;s]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;readFix&nbsp;r&nbsp;=&nbsp;[(read&nbsp;(ds++ds'),&nbsp;length&nbsp;ds',&nbsp;t)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;(ds,d)&nbsp;&lt;-&nbsp;lexDigits&nbsp;r,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ds',t)&nbsp;&lt;-&nbsp;lexFrac&nbsp;d&nbsp;]<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lexFrac&nbsp;('.':ds)&nbsp;=&nbsp;lexDigits&nbsp;ds<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lexFrac&nbsp;s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;[("",s)]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readExp&nbsp;(e:s)&nbsp;|&nbsp;e&nbsp;`elem`&nbsp;"eE"&nbsp;=&nbsp;readExp'&nbsp;s<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readExp&nbsp;s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;[(0,s)]<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readExp'&nbsp;('-':s)&nbsp;=&nbsp;[(-k,t)&nbsp;|&nbsp;(k,t)&nbsp;&lt;-&nbsp;readDec&nbsp;s]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readExp'&nbsp;('+':s)&nbsp;=&nbsp;readDec&nbsp;s<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readExp'&nbsp;s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;readDec&nbsp;s<br>
<br>
lexDigits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;ReadS&nbsp;String&nbsp;<br>
lexDigits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;nonnull&nbsp;isDigit<br>
<br>
nonnull&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;(Char&nbsp;-&gt;&nbsp;Bool)&nbsp;-&gt;&nbsp;ReadS&nbsp;String<br>
nonnull&nbsp;p&nbsp;s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;[(cs,t)&nbsp;|&nbsp;(cs@(_:_),t)&nbsp;&lt;-&nbsp;[span&nbsp;p&nbsp;s]]<br>
<br>
<p>
<hr><i>The Haskell 1.4 Library Report</i><br><a href="index.html">top</a> | <a href="complex.html">back</a> | <a href="ix.html">next</a> | <a href="libindex.html">contents</a> <br><font size=2>April 4, 1997</font>
</tt>