5 <title>Mu -
412render-float-decimal.mu
</title>
6 <meta name=
"Generator" content=
"Vim/8.2">
7 <meta name=
"plugin-version" content=
"vim8.1_v2">
8 <meta name=
"syntax" content=
"none">
9 <meta name=
"settings" content=
"number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=,use_input_for_pc=fallback">
10 <meta name=
"colorscheme" content=
"minimal-light">
13 pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffd7; }
14 body { font-size:12pt; font-family: monospace; color: #000000; background-color: #ffffd7; }
16 * { font-size:12pt; font-size: 1em; }
17 .PreProc { color: #c000c0; }
18 .muRegEdx { color: #af5f00; }
20 .muRegEdi { color: #00af00; }
21 .muRegEsi { color: #005faf; }
22 .muRegEbx { color: #5f00ff; }
23 .Constant { color: #008787; }
24 .muFunction { color: #af5f00; text-decoration: underline; }
25 .muRegEcx { color: #870000; }
26 .Delimiter { color: #c000c0; }
27 .Special { color: #ff6060; }
28 .muTest { color: #5f8700; }
29 .muComment { color: #005faf; }
36 /* function to open any folds containing a jumped-to line before jumping to it */
40 lineNum
= window
.location
.hash
;
41 lineNum
= lineNum
.substr(1); /* strip off '#' */
43 if (lineNum
.indexOf('L') == -1) {
44 lineNum
= 'L'+lineNum
;
46 var lineElem
= document
.getElementById(lineNum
);
47 /* Always jump to new location even if the line was hidden inside a fold, or
48 * we corrected the raw number to a line ID.
51 lineElem
.scrollIntoView(true);
55 if ('onhashchange' in window
) {
56 window
.onhashchange
= JumpToLine
;
62 <body onload='JumpToLine();'
>
63 <a href='https://github.com/akkartik/mu/blob/main/
412render-float-decimal.mu'
>https://github.com/akkartik/mu/blob/main/
412render-float-decimal.mu
</a>
64 <pre id='vimCodeElement'
>
65 <span id=
"L1" class=
"LineNr"> 1 </span><span class=
"muComment"># print out floats in decimal
</span>
66 <span id=
"L2" class=
"LineNr"> 2 </span><span class=
"muComment">#
<a href=
"https://research.swtch.com/ftoa">https://research.swtch.com/ftoa
</a></span>
67 <span id=
"L3" class=
"LineNr"> 3 </span><span class=
"muComment">#
</span>
68 <span id=
"L4" class=
"LineNr"> 4 </span><span class=
"muComment"># Basic idea:
</span>
69 <span id=
"L5" class=
"LineNr"> 5 </span><span class=
"muComment"># Ignoring sign, floating point numbers are represented as
1.mantissa *
2^exponent
</span>
70 <span id=
"L6" class=
"LineNr"> 6 </span><span class=
"muComment"># Therefore, to print a float in decimal, we need to:
</span>
71 <span id=
"L7" class=
"LineNr"> 7 </span><span class=
"muComment"># - compute its value without decimal point
</span>
72 <span id=
"L8" class=
"LineNr"> 8 </span><span class=
"muComment"># - convert to an array of decimal digits
</span>
73 <span id=
"L9" class=
"LineNr"> 9 </span><span class=
"muComment"># - print out the array while inserting the decimal point appropriately
</span>
74 <span id=
"L10" class=
"LineNr"> 10 </span><span class=
"muComment">#
</span>
75 <span id=
"L11" class=
"LineNr"> 11 </span><span class=
"muComment"># Basic complication: the computation generates numbers larger than an int can
</span>
76 <span id=
"L12" class=
"LineNr"> 12 </span><span class=
"muComment"># hold. We need a way to represent big ints.
</span>
77 <span id=
"L13" class=
"LineNr"> 13 </span><span class=
"muComment">#
</span>
78 <span id=
"L14" class=
"LineNr"> 14 </span><span class=
"muComment"># Key insight: use a representation for big ints that's close to what we need
</span>
79 <span id=
"L15" class=
"LineNr"> 15 </span><span class=
"muComment"># anyway, an array of decimal digits.
</span>
80 <span id=
"L16" class=
"LineNr"> 16 </span><span class=
"muComment">#
</span>
81 <span id=
"L17" class=
"LineNr"> 17 </span><span class=
"muComment"># Style note: we aren't creating a big int library here. The only operations
</span>
82 <span id=
"L18" class=
"LineNr"> 18 </span><span class=
"muComment"># we need are halving and doubling. Following the link above, it seems more
</span>
83 <span id=
"L19" class=
"LineNr"> 19 </span><span class=
"muComment"># comprehensible to keep these operations inlined so that we can track the
</span>
84 <span id=
"L20" class=
"LineNr"> 20 </span><span class=
"muComment"># position of the decimal point with dispatch.
</span>
85 <span id=
"L21" class=
"LineNr"> 21 </span><span class=
"muComment">#
</span>
86 <span id=
"L22" class=
"LineNr"> 22 </span><span class=
"muComment"># This approach turns out to be fast enough for most purposes.
</span>
87 <span id=
"L23" class=
"LineNr"> 23 </span><span class=
"muComment"># Optimizations, however, get wildly more complex.
</span>
88 <span id=
"L24" class=
"LineNr"> 24 </span>
89 <span id=
"L25" class=
"LineNr"> 25 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
412render-float-decimal.mu.html#L25'
>test-write-float-decimal-approximate-normal
</a></span> <span class=
"Delimiter">{
</span>
90 <span id=
"L26" class=
"LineNr"> 26 </span> <span class=
"PreProc">var
</span> s-storage: (stream byte
<span class=
"Constant">0x10</span>)
91 <span id=
"L27" class=
"LineNr"> 27 </span> <span class=
"PreProc">var
</span> s/
<span class=
"muRegEcx">ecx
</span>: (addr stream byte)
<span class=
"Special"><-
</span> address s-storage
92 <span id=
"L28" class=
"LineNr"> 28 </span> <span class=
"muComment">#
0.5</span>
93 <span id=
"L29" class=
"LineNr"> 29 </span> <span class=
"PreProc">var
</span> half/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">1</span>,
<span class=
"Constant">2</span>
94 <span id=
"L30" class=
"LineNr"> 30 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, half,
<span class=
"Constant">3</span>
95 <span id=
"L31" class=
"LineNr"> 31 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"0.5"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L25'
>test-write-float-decimal-approximate-normal
</a> 0.5"</span>
96 <span id=
"L32" class=
"LineNr"> 32 </span> <span class=
"muComment">#
0.25</span>
97 <span id=
"L33" class=
"LineNr"> 33 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
98 <span id=
"L34" class=
"LineNr"> 34 </span> <span class=
"PreProc">var
</span> quarter/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">1</span>,
<span class=
"Constant">4</span>
99 <span id=
"L35" class=
"LineNr"> 35 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, quarter,
<span class=
"Constant">3</span>
100 <span id=
"L36" class=
"LineNr"> 36 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"0.25"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L25'
>test-write-float-decimal-approximate-normal
</a> 0.25"</span>
101 <span id=
"L37" class=
"LineNr"> 37 </span> <span class=
"muComment">#
0.75</span>
102 <span id=
"L38" class=
"LineNr"> 38 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
103 <span id=
"L39" class=
"LineNr"> 39 </span> <span class=
"PreProc">var
</span> three-quarters/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">3</span>,
<span class=
"Constant">4</span>
104 <span id=
"L40" class=
"LineNr"> 40 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, three-quarters,
<span class=
"Constant">3</span>
105 <span id=
"L41" class=
"LineNr"> 41 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"0.75"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L25'
>test-write-float-decimal-approximate-normal
</a> 0.75"</span>
106 <span id=
"L42" class=
"LineNr"> 42 </span> <span class=
"muComment">#
0.125</span>
107 <span id=
"L43" class=
"LineNr"> 43 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
108 <span id=
"L44" class=
"LineNr"> 44 </span> <span class=
"PreProc">var
</span> eighth/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">1</span>,
<span class=
"Constant">8</span>
109 <span id=
"L45" class=
"LineNr"> 45 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, eighth,
<span class=
"Constant">3</span>
110 <span id=
"L46" class=
"LineNr"> 46 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"0.125"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L25'
>test-write-float-decimal-approximate-normal
</a> 0.125"</span>
111 <span id=
"L47" class=
"LineNr"> 47 </span> <span class=
"muComment">#
0.0625; start using scientific notation
</span>
112 <span id=
"L48" class=
"LineNr"> 48 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
113 <span id=
"L49" class=
"LineNr"> 49 </span> <span class=
"PreProc">var
</span> sixteenth/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">1</span>,
<span class=
"Constant">0x10</span>
114 <span id=
"L50" class=
"LineNr"> 50 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, sixteenth,
<span class=
"Constant">3</span>
115 <span id=
"L51" class=
"LineNr"> 51 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"6.25e-2"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L25'
>test-write-float-decimal-approximate-normal
</a> 0.0625"</span>
116 <span id=
"L52" class=
"LineNr"> 52 </span> <span class=
"muComment"># sqrt(
2); truncate floats with lots of digits after the decimal but not too many before
</span>
117 <span id=
"L53" class=
"LineNr"> 53 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
118 <span id=
"L54" class=
"LineNr"> 54 </span> <span class=
"PreProc">var
</span> two-f/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">2</span>,
<span class=
"Constant">1</span>
119 <span id=
"L55" class=
"LineNr"> 55 </span> <span class=
"PreProc">var
</span> sqrt-
2/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> square-root two-f
120 <span id=
"L56" class=
"LineNr"> 56 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, sqrt-
2,
<span class=
"Constant">3</span>
121 <span id=
"L57" class=
"LineNr"> 57 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"1.414"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L25'
>test-write-float-decimal-approximate-normal
</a> √
2"</span>
122 <span id=
"L58" class=
"LineNr"> 58 </span><span class=
"Delimiter">}
</span>
123 <span id=
"L59" class=
"LineNr"> 59 </span>
124 <span id=
"L60" class=
"LineNr"> 60 </span><span class=
"muComment"># print whole integers without decimals
</span>
125 <span id=
"L61" class=
"LineNr"> 61 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
412render-float-decimal.mu.html#L61'
>test-write-float-decimal-approximate-integer
</a></span> <span class=
"Delimiter">{
</span>
126 <span id=
"L62" class=
"LineNr"> 62 </span> <span class=
"PreProc">var
</span> s-storage: (stream byte
<span class=
"Constant">0x10</span>)
127 <span id=
"L63" class=
"LineNr"> 63 </span> <span class=
"PreProc">var
</span> s/
<span class=
"muRegEcx">ecx
</span>: (addr stream byte)
<span class=
"Special"><-
</span> address s-storage
128 <span id=
"L64" class=
"LineNr"> 64 </span> <span class=
"muComment">#
1</span>
129 <span id=
"L65" class=
"LineNr"> 65 </span> <span class=
"PreProc">var
</span> one-f/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">1</span>,
<span class=
"Constant">1</span>
130 <span id=
"L66" class=
"LineNr"> 66 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, one-f,
<span class=
"Constant">3</span>
131 <span id=
"L67" class=
"LineNr"> 67 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"1"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L61'
>test-write-float-decimal-approximate-integer
</a> 1"</span>
132 <span id=
"L68" class=
"LineNr"> 68 </span> <span class=
"muComment">#
2</span>
133 <span id=
"L69" class=
"LineNr"> 69 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
134 <span id=
"L70" class=
"LineNr"> 70 </span> <span class=
"PreProc">var
</span> two-f/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">2</span>,
<span class=
"Constant">1</span>
135 <span id=
"L71" class=
"LineNr"> 71 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, two-f,
<span class=
"Constant">3</span>
136 <span id=
"L72" class=
"LineNr"> 72 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"2"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L61'
>test-write-float-decimal-approximate-integer
</a> 2"</span>
137 <span id=
"L73" class=
"LineNr"> 73 </span> <span class=
"muComment">#
10</span>
138 <span id=
"L74" class=
"LineNr"> 74 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
139 <span id=
"L75" class=
"LineNr"> 75 </span> <span class=
"PreProc">var
</span> ten-f/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">0xa</span>,
<span class=
"Constant">1</span>
140 <span id=
"L76" class=
"LineNr"> 76 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, ten-f,
<span class=
"Constant">3</span>
141 <span id=
"L77" class=
"LineNr"> 77 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"10"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L61'
>test-write-float-decimal-approximate-integer
</a> 10"</span>
142 <span id=
"L78" class=
"LineNr"> 78 </span> <span class=
"muComment"># -
10</span>
143 <span id=
"L79" class=
"LineNr"> 79 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
144 <span id=
"L80" class=
"LineNr"> 80 </span> <span class=
"PreProc">var
</span> minus-ten-f/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">-
0xa</span>,
<span class=
"Constant">1</span>
145 <span id=
"L81" class=
"LineNr"> 81 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, minus-ten-f,
<span class=
"Constant">3</span>
146 <span id=
"L82" class=
"LineNr"> 82 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"-
10"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L61'
>test-write-float-decimal-approximate-integer
</a> -
10"</span>
147 <span id=
"L83" class=
"LineNr"> 83 </span> <span class=
"muComment">#
999</span>
148 <span id=
"L84" class=
"LineNr"> 84 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
149 <span id=
"L85" class=
"LineNr"> 85 </span> <span class=
"PreProc">var
</span> minus-ten-f/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">0x3e7</span>,
<span class=
"Constant">1</span>
150 <span id=
"L86" class=
"LineNr"> 86 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, minus-ten-f,
<span class=
"Constant">3</span>
151 <span id=
"L87" class=
"LineNr"> 87 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"999"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L61'
>test-write-float-decimal-approximate-integer
</a> 1000"</span>
152 <span id=
"L88" class=
"LineNr"> 88 </span> <span class=
"muComment">#
1000 - start using scientific notation
</span>
153 <span id=
"L89" class=
"LineNr"> 89 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
154 <span id=
"L90" class=
"LineNr"> 90 </span> <span class=
"PreProc">var
</span> minus-ten-f/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> <a href='
408float.mu.html#L18'
>rational
</a> <span class=
"Constant">0x3e8</span>,
<span class=
"Constant">1</span>
155 <span id=
"L91" class=
"LineNr"> 91 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, minus-ten-f,
<span class=
"Constant">3</span>
156 <span id=
"L92" class=
"LineNr"> 92 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"1.00e3
"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L61'
>test-write-float-decimal-approximate-integer
</a> 1000"</span>
157 <span id=
"L93" class=
"LineNr"> 93 </span> <span class=
"muComment">#
100,
000</span>
158 <span id=
"L94" class=
"LineNr"> 94 </span> <a href='
106stream.subx.html#L20'
>clear-stream
</a> s
159 <span id=
"L95" class=
"LineNr"> 95 </span> <span class=
"PreProc">var
</span> hundred-thousand/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x186a0</span>
160 <span id=
"L96" class=
"LineNr"> 96 </span> <span class=
"PreProc">var
</span> hundred-thousand-f/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> convert hundred-thousand
161 <span id=
"L97" class=
"LineNr"> 97 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, hundred-thousand-f,
<span class=
"Constant">3</span>
162 <span id=
"L98" class=
"LineNr"> 98 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"1.00e5
"</span>,
<span class=
"Constant">"F -
<a href='
412render-float-decimal.mu.html#L61'
>test-write-float-decimal-approximate-integer
</a> 100,
000"</span>
163 <span id=
"L99" class=
"LineNr"> 99 </span><span class=
"Delimiter">}
</span>
164 <span id=
"L100" class=
"LineNr">100 </span>
165 <span id=
"L101" class=
"LineNr">101 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
412render-float-decimal.mu.html#L101'
>test-write-float-decimal-approximate-zero
</a></span> <span class=
"Delimiter">{
</span>
166 <span id=
"L102" class=
"LineNr">102 </span> <span class=
"PreProc">var
</span> s-storage: (stream byte
<span class=
"Constant">0x10</span>)
167 <span id=
"L103" class=
"LineNr">103 </span> <span class=
"PreProc">var
</span> s/
<span class=
"muRegEcx">ecx
</span>: (addr stream byte)
<span class=
"Special"><-
</span> address s-storage
168 <span id=
"L104" class=
"LineNr">104 </span> <span class=
"PreProc">var
</span> zero: float
169 <span id=
"L105" class=
"LineNr">105 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, zero,
<span class=
"Constant">3</span>
170 <span id=
"L106" class=
"LineNr">106 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"0"</span>,
<span class=
"Constant">"F - test-write-float-decimal-approximate-zero
"</span>
171 <span id=
"L107" class=
"LineNr">107 </span><span class=
"Delimiter">}
</span>
172 <span id=
"L108" class=
"LineNr">108 </span>
173 <span id=
"L109" class=
"LineNr">109 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
412render-float-decimal.mu.html#L109'
>test-write-float-decimal-approximate-negative-zero
</a></span> <span class=
"Delimiter">{
</span>
174 <span id=
"L110" class=
"LineNr">110 </span> <span class=
"PreProc">var
</span> s-storage: (stream byte
<span class=
"Constant">0x10</span>)
175 <span id=
"L111" class=
"LineNr">111 </span> <span class=
"PreProc">var
</span> s/
<span class=
"muRegEcx">ecx
</span>: (addr stream byte)
<span class=
"Special"><-
</span> address s-storage
176 <span id=
"L112" class=
"LineNr">112 </span> <span class=
"PreProc">var
</span> n: int
177 <span id=
"L113" class=
"LineNr">113 </span> copy-to n,
<span class=
"Constant">0x80000000</span>
178 <span id=
"L114" class=
"LineNr">114 </span> <span class=
"PreProc">var
</span> negative-zero/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> reinterpret n
179 <span id=
"L115" class=
"LineNr">115 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, negative-zero,
<span class=
"Constant">3</span>
180 <span id=
"L116" class=
"LineNr">116 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"-
0"</span>,
<span class=
"Constant">"F - test-write-float-decimal-approximate-negative-zero
"</span>
181 <span id=
"L117" class=
"LineNr">117 </span><span class=
"Delimiter">}
</span>
182 <span id=
"L118" class=
"LineNr">118 </span>
183 <span id=
"L119" class=
"LineNr">119 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
412render-float-decimal.mu.html#L119'
>test-write-float-decimal-approximate-infinity
</a></span> <span class=
"Delimiter">{
</span>
184 <span id=
"L120" class=
"LineNr">120 </span> <span class=
"PreProc">var
</span> s-storage: (stream byte
<span class=
"Constant">0x10</span>)
185 <span id=
"L121" class=
"LineNr">121 </span> <span class=
"PreProc">var
</span> s/
<span class=
"muRegEcx">ecx
</span>: (addr stream byte)
<span class=
"Special"><-
</span> address s-storage
186 <span id=
"L122" class=
"LineNr">122 </span> <span class=
"PreProc">var
</span> n: int
187 <span id=
"L123" class=
"LineNr">123 </span> <span class=
"muComment">#
0|
11111111|
00000000000000000000000</span>
188 <span id=
"L124" class=
"LineNr">124 </span> <span class=
"muComment">#
0111|
1111|
1000|
0000|
0000|
0000|
0000|
0000</span>
189 <span id=
"L125" class=
"LineNr">125 </span> copy-to n,
<span class=
"Constant">0x7f800000</span>
190 <span id=
"L126" class=
"LineNr">126 </span> <span class=
"PreProc">var
</span> infinity/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> reinterpret n
191 <span id=
"L127" class=
"LineNr">127 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, infinity,
<span class=
"Constant">3</span>
192 <span id=
"L128" class=
"LineNr">128 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"Inf
"</span>,
<span class=
"Constant">"F - test-write-float-decimal-approximate-infinity
"</span>
193 <span id=
"L129" class=
"LineNr">129 </span><span class=
"Delimiter">}
</span>
194 <span id=
"L130" class=
"LineNr">130 </span>
195 <span id=
"L131" class=
"LineNr">131 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
412render-float-decimal.mu.html#L131'
>test-write-float-decimal-approximate-negative-infinity
</a></span> <span class=
"Delimiter">{
</span>
196 <span id=
"L132" class=
"LineNr">132 </span> <span class=
"PreProc">var
</span> s-storage: (stream byte
<span class=
"Constant">0x10</span>)
197 <span id=
"L133" class=
"LineNr">133 </span> <span class=
"PreProc">var
</span> s/
<span class=
"muRegEcx">ecx
</span>: (addr stream byte)
<span class=
"Special"><-
</span> address s-storage
198 <span id=
"L134" class=
"LineNr">134 </span> <span class=
"PreProc">var
</span> n: int
199 <span id=
"L135" class=
"LineNr">135 </span> copy-to n,
<span class=
"Constant">0xff800000</span>
200 <span id=
"L136" class=
"LineNr">136 </span> <span class=
"PreProc">var
</span> negative-infinity/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> reinterpret n
201 <span id=
"L137" class=
"LineNr">137 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, negative-infinity,
<span class=
"Constant">3</span>
202 <span id=
"L138" class=
"LineNr">138 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"-Inf
"</span>,
<span class=
"Constant">"F - test-write-float-decimal-approximate-negative-infinity
"</span>
203 <span id=
"L139" class=
"LineNr">139 </span><span class=
"Delimiter">}
</span>
204 <span id=
"L140" class=
"LineNr">140 </span>
205 <span id=
"L141" class=
"LineNr">141 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
412render-float-decimal.mu.html#L141'
>test-write-float-decimal-approximate-not-a-number
</a></span> <span class=
"Delimiter">{
</span>
206 <span id=
"L142" class=
"LineNr">142 </span> <span class=
"PreProc">var
</span> s-storage: (stream byte
<span class=
"Constant">0x10</span>)
207 <span id=
"L143" class=
"LineNr">143 </span> <span class=
"PreProc">var
</span> s/
<span class=
"muRegEcx">ecx
</span>: (addr stream byte)
<span class=
"Special"><-
</span> address s-storage
208 <span id=
"L144" class=
"LineNr">144 </span> <span class=
"PreProc">var
</span> n: int
209 <span id=
"L145" class=
"LineNr">145 </span> copy-to n,
<span class=
"Constant">0xffffffff</span> <span class=
"muComment"># exponent must be all
1's, and mantissa must be non-zero
</span>
210 <span id=
"L146" class=
"LineNr">146 </span> <span class=
"PreProc">var
</span> nan/
<span class=
"Constant">xmm0
</span>: float
<span class=
"Special"><-
</span> reinterpret n
211 <span id=
"L147" class=
"LineNr">147 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, nan,
<span class=
"Constant">3</span>
212 <span id=
"L148" class=
"LineNr">148 </span> <a href='
109stream-equal.subx.html#L194'
>check-stream-equal
</a> s,
<span class=
"Constant">"NaN
"</span>,
<span class=
"Constant">"F - test-write-float-decimal-approximate-not-a-number
"</span>
213 <span id=
"L149" class=
"LineNr">149 </span><span class=
"Delimiter">}
</span>
214 <span id=
"L150" class=
"LineNr">150 </span>
215 <span id=
"L151" class=
"LineNr">151 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L151'
>render-float-decimal
</a></span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>), in: float, precision: int, x: int, y: int, color: int, background-color: int
<span class=
"PreProc"> -
> </span>_/eax: int
<span class=
"Delimiter">{
</span>
216 <span id=
"L152" class=
"LineNr">152 </span> <span class=
"PreProc">var
</span> s-storage: (stream byte
<span class=
"Constant">0x10</span>)
217 <span id=
"L153" class=
"LineNr">153 </span> <span class=
"PreProc">var
</span> s/
<span class=
"muRegEsi">esi
</span>: (addr stream byte)
<span class=
"Special"><-
</span> address s-storage
218 <span id=
"L154" class=
"LineNr">154 </span> <a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a> s, in, precision
219 <span id=
"L155" class=
"LineNr">155 </span> <span class=
"PreProc">var
</span> width/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
220 <span id=
"L156" class=
"LineNr">156 </span> <span class=
"PreProc">var
</span> height/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
221 <span id=
"L157" class=
"LineNr">157 </span> width, height
<span class=
"Special"><-
</span> <a href='
500fake-screen.mu.html#L75'
>screen-size
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>
222 <span id=
"L158" class=
"LineNr">158 </span> <span class=
"PreProc">var
</span> result/eax: int
<span class=
"Special"><-
</span> <a href='
501draw-text.mu.html#L117'
>draw-stream-rightward
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, s, x, width, y, color, background-color
223 <span id=
"L159" class=
"LineNr">159 </span> <span class=
"PreProc">return
</span> result
224 <span id=
"L160" class=
"LineNr">160 </span><span class=
"Delimiter">}
</span>
225 <span id=
"L161" class=
"LineNr">161 </span>
226 <span id=
"L162" class=
"LineNr">162 </span><span class=
"muComment"># 'precision' controls the maximum width past which we resort to scientific notation
</span>
227 <span id=
"L163" class=
"LineNr">163 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L163'
>write-float-decimal-approximate
</a></span> out: (addr stream byte), in: float, precision: int
<span class=
"Delimiter">{
</span>
228 <span id=
"L164" class=
"LineNr">164 </span> <span class=
"muComment"># - special names
</span>
229 <span id=
"L165" class=
"LineNr">165 </span> <span class=
"PreProc">var
</span> bits/eax: int
<span class=
"Special"><-
</span> reinterpret in
230 <span id=
"L166" class=
"LineNr">166 </span> compare bits,
<span class=
"Constant">0</span>
231 <span id=
"L167" class=
"LineNr">167 </span> <span class=
"Delimiter">{
</span>
232 <span id=
"L168" class=
"LineNr">168 </span> <span class=
"PreProc">break-if-!=
</span>
233 <span id=
"L169" class=
"LineNr">169 </span> <a href='
108write.subx.html#L11'
>write
</a> out,
<span class=
"Constant">"0"</span>
234 <span id=
"L170" class=
"LineNr">170 </span> <span class=
"PreProc">return
</span>
235 <span id=
"L171" class=
"LineNr">171 </span> <span class=
"Delimiter">}
</span>
236 <span id=
"L172" class=
"LineNr">172 </span> compare bits,
<span class=
"Constant">0x80000000</span>
237 <span id=
"L173" class=
"LineNr">173 </span> <span class=
"Delimiter">{
</span>
238 <span id=
"L174" class=
"LineNr">174 </span> <span class=
"PreProc">break-if-!=
</span>
239 <span id=
"L175" class=
"LineNr">175 </span> <a href='
108write.subx.html#L11'
>write
</a> out,
<span class=
"Constant">"-
0"</span>
240 <span id=
"L176" class=
"LineNr">176 </span> <span class=
"PreProc">return
</span>
241 <span id=
"L177" class=
"LineNr">177 </span> <span class=
"Delimiter">}
</span>
242 <span id=
"L178" class=
"LineNr">178 </span> compare bits,
<span class=
"Constant">0x7f800000</span>
243 <span id=
"L179" class=
"LineNr">179 </span> <span class=
"Delimiter">{
</span>
244 <span id=
"L180" class=
"LineNr">180 </span> <span class=
"PreProc">break-if-!=
</span>
245 <span id=
"L181" class=
"LineNr">181 </span> <a href='
108write.subx.html#L11'
>write
</a> out,
<span class=
"Constant">"Inf
"</span>
246 <span id=
"L182" class=
"LineNr">182 </span> <span class=
"PreProc">return
</span>
247 <span id=
"L183" class=
"LineNr">183 </span> <span class=
"Delimiter">}
</span>
248 <span id=
"L184" class=
"LineNr">184 </span> compare bits,
<span class=
"Constant">0xff800000</span>
249 <span id=
"L185" class=
"LineNr">185 </span> <span class=
"Delimiter">{
</span>
250 <span id=
"L186" class=
"LineNr">186 </span> <span class=
"PreProc">break-if-!=
</span>
251 <span id=
"L187" class=
"LineNr">187 </span> <a href='
108write.subx.html#L11'
>write
</a> out,
<span class=
"Constant">"-Inf
"</span>
252 <span id=
"L188" class=
"LineNr">188 </span> <span class=
"PreProc">return
</span>
253 <span id=
"L189" class=
"LineNr">189 </span> <span class=
"Delimiter">}
</span>
254 <span id=
"L190" class=
"LineNr">190 </span> <span class=
"PreProc">var
</span> exponent/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy bits
255 <span id=
"L191" class=
"LineNr">191 </span> exponent
<span class=
"Special"><-
</span> shift-right
<span class=
"Constant">0x17</span> <span class=
"muComment">#
23 bits of mantissa
</span>
256 <span id=
"L192" class=
"LineNr">192 </span> exponent
<span class=
"Special"><-
</span> and
<span class=
"Constant">0xff</span>
257 <span id=
"L193" class=
"LineNr">193 </span> exponent
<span class=
"Special"><-
</span> subtract
<span class=
"Constant">0x7f</span>
258 <span id=
"L194" class=
"LineNr">194 </span> compare exponent,
<span class=
"Constant">0x80</span>
259 <span id=
"L195" class=
"LineNr">195 </span> <span class=
"Delimiter">{
</span>
260 <span id=
"L196" class=
"LineNr">196 </span> <span class=
"PreProc">break-if-!=
</span>
261 <span id=
"L197" class=
"LineNr">197 </span> <a href='
108write.subx.html#L11'
>write
</a> out,
<span class=
"Constant">"NaN
"</span>
262 <span id=
"L198" class=
"LineNr">198 </span> <span class=
"PreProc">return
</span>
263 <span id=
"L199" class=
"LineNr">199 </span> <span class=
"Delimiter">}
</span>
264 <span id=
"L200" class=
"LineNr">200 </span> <span class=
"muComment"># - regular numbers
</span>
265 <span id=
"L201" class=
"LineNr">201 </span> <span class=
"PreProc">var
</span> sign/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy bits
266 <span id=
"L202" class=
"LineNr">202 </span> sign
<span class=
"Special"><-
</span> shift-right
<span class=
"Constant">0x1f</span>
267 <span id=
"L203" class=
"LineNr">203 </span> <span class=
"Delimiter">{
</span>
268 <span id=
"L204" class=
"LineNr">204 </span> compare sign,
<span class=
"Constant">1</span>
269 <span id=
"L205" class=
"LineNr">205 </span> <span class=
"PreProc">break-if-!=
</span>
270 <span id=
"L206" class=
"LineNr">206 </span> <a href='
115write-byte.subx.html#L12'
>append-byte
</a> out,
<span class=
"Constant">0x2d</span>/minus
271 <span id=
"L207" class=
"LineNr">207 </span> <span class=
"Delimiter">}
</span>
272 <span id=
"L208" class=
"LineNr">208 </span>
273 <span id=
"L209" class=
"LineNr">209 </span> <span class=
"muComment"># v =
1.mantissa (in base
2)
<< 0x17</span>
274 <span id=
"L210" class=
"LineNr">210 </span> <span class=
"PreProc">var
</span> v/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy bits
275 <span id=
"L211" class=
"LineNr">211 </span> v
<span class=
"Special"><-
</span> and
<span class=
"Constant">0x7fffff</span>
276 <span id=
"L212" class=
"LineNr">212 </span> v
<span class=
"Special"><-
</span> or
<span class=
"Constant">0x00800000</span> <span class=
"muComment"># insert implicit
1</span>
277 <span id=
"L213" class=
"LineNr">213 </span> <span class=
"muComment"># e = exponent -
0x17</span>
278 <span id=
"L214" class=
"LineNr">214 </span> <span class=
"PreProc">var
</span> e/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy exponent
279 <span id=
"L215" class=
"LineNr">215 </span> e
<span class=
"Special"><-
</span> subtract
<span class=
"Constant">0x17</span> <span class=
"muComment"># move decimal place from before mantissa to after
</span>
280 <span id=
"L216" class=
"LineNr">216 </span>
281 <span id=
"L217" class=
"LineNr">217 </span> <span class=
"muComment"># initialize buffer with decimal representation of v
</span>
282 <span id=
"L218" class=
"LineNr">218 </span> <span class=
"muComment"># unlike
<a href=
"https://research.swtch.com/ftoa">https://research.swtch.com/ftoa
</a>, no ascii here
</span>
283 <span id=
"L219" class=
"LineNr">219 </span> <span class=
"PreProc">var
</span> buf-storage: (array byte
<span class=
"Constant">0x7f</span>)
284 <span id=
"L220" class=
"LineNr">220 </span> <span class=
"PreProc">var
</span> buf/
<span class=
"muRegEdi">edi
</span>: (addr array byte)
<span class=
"Special"><-
</span> address buf-storage
285 <span id=
"L221" class=
"LineNr">221 </span> <span class=
"PreProc">var
</span> n/eax: int
<span class=
"Special"><-
</span> <a href='
412render-float-decimal.mu.html#L251'
>decimal-digits
</a> v, buf
286 <span id=
"L222" class=
"LineNr">222 </span> <span class=
"muComment"># I suspect we can do without reversing, but we'll follow
<a href=
"https://research.swtch.com/ftoa">https://research.swtch.com/ftoa
</a></span>
287 <span id=
"L223" class=
"LineNr">223 </span> <span class=
"muComment"># closely for now.
</span>
288 <span id=
"L224" class=
"LineNr">224 </span> <a href='
412render-float-decimal.mu.html#L268'
>reverse-digits
</a> buf, n
289 <span id=
"L225" class=
"LineNr">225 </span>
290 <span id=
"L226" class=
"LineNr">226 </span> <span class=
"muComment"># loop if e
> 0</span>
291 <span id=
"L227" class=
"LineNr">227 </span> <span class=
"Delimiter">{
</span>
292 <span id=
"L228" class=
"LineNr">228 </span> compare e,
<span class=
"Constant">0</span>
293 <span id=
"L229" class=
"LineNr">229 </span> <span class=
"PreProc">break-if-
<=
</span>
294 <span id=
"L230" class=
"LineNr">230 </span> n
<span class=
"Special"><-
</span> <a href='
412render-float-decimal.mu.html#L290'
>double-array-of-decimal-digits
</a> buf, n
295 <span id=
"L231" class=
"LineNr">231 </span> e
<span class=
"Special"><-
</span> decrement
296 <span id=
"L232" class=
"LineNr">232 </span> <span class=
"PreProc">loop
</span>
297 <span id=
"L233" class=
"LineNr">233 </span> <span class=
"Delimiter">}
</span>
298 <span id=
"L234" class=
"LineNr">234 </span>
299 <span id=
"L235" class=
"LineNr">235 </span> <span class=
"PreProc">var
</span> dp/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy n
300 <span id=
"L236" class=
"LineNr">236 </span>
301 <span id=
"L237" class=
"LineNr">237 </span> <span class=
"muComment"># loop if e
< 0</span>
302 <span id=
"L238" class=
"LineNr">238 </span> <span class=
"Delimiter">{
</span>
303 <span id=
"L239" class=
"LineNr">239 </span> compare e,
<span class=
"Constant">0</span>
304 <span id=
"L240" class=
"LineNr">240 </span> <span class=
"PreProc">break-if-
>=
</span>
305 <span id=
"L241" class=
"LineNr">241 </span> n, dp
<span class=
"Special"><-
</span> <a href='
412render-float-decimal.mu.html#L341'
>halve-array-of-decimal-digits
</a> buf, n, dp
306 <span id=
"L242" class=
"LineNr">242 </span> e
<span class=
"Special"><-
</span> increment
307 <span id=
"L243" class=
"LineNr">243 </span> <span class=
"PreProc">loop
</span>
308 <span id=
"L244" class=
"LineNr">244 </span> <span class=
"Delimiter">}
</span>
309 <span id=
"L245" class=
"LineNr">245 </span>
310 <span id=
"L246" class=
"LineNr">246 </span> <a href='
412render-float-decimal.mu.html#L415'
>_write-float-array-of-decimal-digits
</a> out, buf, n, dp, precision
311 <span id=
"L247" class=
"LineNr">247 </span><span class=
"Delimiter">}
</span>
312 <span id=
"L248" class=
"LineNr">248 </span>
313 <span id=
"L249" class=
"LineNr">249 </span><span class=
"muComment"># store the decimal digits of 'n' into 'buf', units first
</span>
314 <span id=
"L250" class=
"LineNr">250 </span><span class=
"muComment"># n must be positive
</span>
315 <span id=
"L251" class=
"LineNr">251 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L251'
>decimal-digits
</a></span> n: int, _buf: (addr array byte)
<span class=
"PreProc"> -
> </span>_/eax: int
<span class=
"Delimiter">{
</span>
316 <span id=
"L252" class=
"LineNr">252 </span> <span class=
"PreProc">var
</span> buf/
<span class=
"muRegEdi">edi
</span>: (addr array byte)
<span class=
"Special"><-
</span> copy _buf
317 <span id=
"L253" class=
"LineNr">253 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
318 <span id=
"L254" class=
"LineNr">254 </span> <span class=
"PreProc">var
</span> curr/eax: int
<span class=
"Special"><-
</span> copy n
319 <span id=
"L255" class=
"LineNr">255 </span> <span class=
"PreProc">var
</span> curr-byte/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
320 <span id=
"L256" class=
"LineNr">256 </span> <span class=
"Delimiter">{
</span>
321 <span id=
"L257" class=
"LineNr">257 </span> compare curr,
<span class=
"Constant">0</span>
322 <span id=
"L258" class=
"LineNr">258 </span> <span class=
"PreProc">break-if-=
</span>
323 <span id=
"L259" class=
"LineNr">259 </span> curr, curr-byte
<span class=
"Special"><-
</span> <a href='
314divide.subx.html#L3'
>integer-divide
</a> curr,
<span class=
"Constant">0xa</span>
324 <span id=
"L260" class=
"LineNr">260 </span> <span class=
"PreProc">var
</span> dest/
<span class=
"muRegEbx">ebx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, i
325 <span id=
"L261" class=
"LineNr">261 </span> copy-byte-to *dest, curr-byte
326 <span id=
"L262" class=
"LineNr">262 </span> i
<span class=
"Special"><-
</span> increment
327 <span id=
"L263" class=
"LineNr">263 </span> <span class=
"PreProc">loop
</span>
328 <span id=
"L264" class=
"LineNr">264 </span> <span class=
"Delimiter">}
</span>
329 <span id=
"L265" class=
"LineNr">265 </span> <span class=
"PreProc">return
</span> i
330 <span id=
"L266" class=
"LineNr">266 </span><span class=
"Delimiter">}
</span>
331 <span id=
"L267" class=
"LineNr">267 </span>
332 <span id=
"L268" class=
"LineNr">268 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L268'
>reverse-digits
</a></span> _buf: (addr array byte), n: int
<span class=
"Delimiter">{
</span>
333 <span id=
"L269" class=
"LineNr">269 </span> <span class=
"PreProc">var
</span> buf/
<span class=
"muRegEsi">esi
</span>: (addr array byte)
<span class=
"Special"><-
</span> copy _buf
334 <span id=
"L270" class=
"LineNr">270 </span> <span class=
"PreProc">var
</span> left/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
335 <span id=
"L271" class=
"LineNr">271 </span> <span class=
"PreProc">var
</span> right/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy n
336 <span id=
"L272" class=
"LineNr">272 </span> right
<span class=
"Special"><-
</span> decrement
337 <span id=
"L273" class=
"LineNr">273 </span> <span class=
"Delimiter">{
</span>
338 <span id=
"L274" class=
"LineNr">274 </span> compare left, right
339 <span id=
"L275" class=
"LineNr">275 </span> <span class=
"PreProc">break-if-
>=
</span>
340 <span id=
"L276" class=
"LineNr">276 </span> <span class=
"Delimiter">{
</span>
341 <span id=
"L277" class=
"LineNr">277 </span> <span class=
"PreProc">var
</span> l-a/
<span class=
"muRegEcx">ecx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, left
342 <span id=
"L278" class=
"LineNr">278 </span> <span class=
"PreProc">var
</span> r-a/
<span class=
"muRegEdx">edx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, right
343 <span id=
"L279" class=
"LineNr">279 </span> <span class=
"PreProc">var
</span> l/
<span class=
"muRegEbx">ebx
</span>: byte
<span class=
"Special"><-
</span> copy-byte *l-a
344 <span id=
"L280" class=
"LineNr">280 </span> <span class=
"PreProc">var
</span> r/eax: byte
<span class=
"Special"><-
</span> copy-byte *r-a
345 <span id=
"L281" class=
"LineNr">281 </span> copy-byte-to *l-a, r
346 <span id=
"L282" class=
"LineNr">282 </span> copy-byte-to *r-a, l
347 <span id=
"L283" class=
"LineNr">283 </span> <span class=
"Delimiter">}
</span>
348 <span id=
"L284" class=
"LineNr">284 </span> left
<span class=
"Special"><-
</span> increment
349 <span id=
"L285" class=
"LineNr">285 </span> right
<span class=
"Special"><-
</span> decrement
350 <span id=
"L286" class=
"LineNr">286 </span> <span class=
"PreProc">loop
</span>
351 <span id=
"L287" class=
"LineNr">287 </span> <span class=
"Delimiter">}
</span>
352 <span id=
"L288" class=
"LineNr">288 </span><span class=
"Delimiter">}
</span>
353 <span id=
"L289" class=
"LineNr">289 </span>
354 <span id=
"L290" class=
"LineNr">290 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L290'
>double-array-of-decimal-digits
</a></span> _buf: (addr array byte), _n: int
<span class=
"PreProc"> -
> </span>_/eax: int
<span class=
"Delimiter">{
</span>
355 <span id=
"L291" class=
"LineNr">291 </span> <span class=
"PreProc">var
</span> buf/
<span class=
"muRegEdi">edi
</span>: (addr array byte)
<span class=
"Special"><-
</span> copy _buf
356 <span id=
"L292" class=
"LineNr">292 </span> <span class=
"muComment"># initialize delta
</span>
357 <span id=
"L293" class=
"LineNr">293 </span> <span class=
"PreProc">var
</span> delta/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
358 <span id=
"L294" class=
"LineNr">294 </span> <span class=
"Delimiter">{
</span>
359 <span id=
"L295" class=
"LineNr">295 </span> <span class=
"PreProc">var
</span> curr/
<span class=
"muRegEbx">ebx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf,
<span class=
"Constant">0</span>
360 <span id=
"L296" class=
"LineNr">296 </span> <span class=
"PreProc">var
</span> tmp/eax: byte
<span class=
"Special"><-
</span> copy-byte *curr
361 <span id=
"L297" class=
"LineNr">297 </span> compare tmp,
<span class=
"Constant">5</span>
362 <span id=
"L298" class=
"LineNr">298 </span> <span class=
"PreProc">break-if-
<</span>
363 <span id=
"L299" class=
"LineNr">299 </span> delta
<span class=
"Special"><-
</span> copy
<span class=
"Constant">1</span>
364 <span id=
"L300" class=
"LineNr">300 </span> <span class=
"Delimiter">}
</span>
365 <span id=
"L301" class=
"LineNr">301 </span> <span class=
"muComment"># loop
</span>
366 <span id=
"L302" class=
"LineNr">302 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
367 <span id=
"L303" class=
"LineNr">303 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy _n
368 <span id=
"L304" class=
"LineNr">304 </span> i
<span class=
"Special"><-
</span> decrement
369 <span id=
"L305" class=
"LineNr">305 </span> <span class=
"Delimiter">{
</span>
370 <span id=
"L306" class=
"LineNr">306 </span> compare i,
<span class=
"Constant">0</span>
371 <span id=
"L307" class=
"LineNr">307 </span> <span class=
"PreProc">break-if-
<=
</span>
372 <span id=
"L308" class=
"LineNr">308 </span> <span class=
"muComment"># x +=
2*buf[i]
</span>
373 <span id=
"L309" class=
"LineNr">309 </span> <span class=
"Delimiter">{
</span>
374 <span id=
"L310" class=
"LineNr">310 </span> <span class=
"PreProc">var
</span> tmp/
<span class=
"muRegEcx">ecx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, i
375 <span id=
"L311" class=
"LineNr">311 </span> <span class=
"PreProc">var
</span> tmp2/
<span class=
"muRegEcx">ecx
</span>: byte
<span class=
"Special"><-
</span> copy-byte *tmp
376 <span id=
"L312" class=
"LineNr">312 </span> x
<span class=
"Special"><-
</span> add tmp2
377 <span id=
"L313" class=
"LineNr">313 </span> x
<span class=
"Special"><-
</span> add tmp2
378 <span id=
"L314" class=
"LineNr">314 </span> <span class=
"Delimiter">}
</span>
379 <span id=
"L315" class=
"LineNr">315 </span> <span class=
"muComment"># x, buf[i+delta] = x/
10, x%
10</span>
380 <span id=
"L316" class=
"LineNr">316 </span> <span class=
"Delimiter">{
</span>
381 <span id=
"L317" class=
"LineNr">317 </span> <span class=
"PreProc">var
</span> dest-index/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy i
382 <span id=
"L318" class=
"LineNr">318 </span> dest-index
<span class=
"Special"><-
</span> add delta
383 <span id=
"L319" class=
"LineNr">319 </span> <span class=
"PreProc">var
</span> dest/
<span class=
"muRegEdi">edi
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, dest-index
384 <span id=
"L320" class=
"LineNr">320 </span> <span class=
"PreProc">var
</span> next-digit/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
385 <span id=
"L321" class=
"LineNr">321 </span> x, next-digit
<span class=
"Special"><-
</span> <a href='
314divide.subx.html#L3'
>integer-divide
</a> x,
<span class=
"Constant">0xa</span>
386 <span id=
"L322" class=
"LineNr">322 </span> copy-byte-to *dest, next-digit
387 <span id=
"L323" class=
"LineNr">323 </span> <span class=
"Delimiter">}
</span>
388 <span id=
"L324" class=
"LineNr">324 </span> <span class=
"muComment">#
</span>
389 <span id=
"L325" class=
"LineNr">325 </span> i
<span class=
"Special"><-
</span> decrement
390 <span id=
"L326" class=
"LineNr">326 </span> <span class=
"PreProc">loop
</span>
391 <span id=
"L327" class=
"LineNr">327 </span> <span class=
"Delimiter">}
</span>
392 <span id=
"L328" class=
"LineNr">328 </span> <span class=
"muComment"># final patch-up
</span>
393 <span id=
"L329" class=
"LineNr">329 </span> <span class=
"PreProc">var
</span> n/eax: int
<span class=
"Special"><-
</span> copy _n
394 <span id=
"L330" class=
"LineNr">330 </span> compare delta,
<span class=
"Constant">1</span>
395 <span id=
"L331" class=
"LineNr">331 </span> <span class=
"Delimiter">{
</span>
396 <span id=
"L332" class=
"LineNr">332 </span> <span class=
"PreProc">break-if-!=
</span>
397 <span id=
"L333" class=
"LineNr">333 </span> <span class=
"PreProc">var
</span> curr/
<span class=
"muRegEbx">ebx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf,
<span class=
"Constant">0</span>
398 <span id=
"L334" class=
"LineNr">334 </span> <span class=
"PreProc">var
</span> one/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">1</span>
399 <span id=
"L335" class=
"LineNr">335 </span> copy-byte-to *curr, one
400 <span id=
"L336" class=
"LineNr">336 </span> n
<span class=
"Special"><-
</span> increment
401 <span id=
"L337" class=
"LineNr">337 </span> <span class=
"Delimiter">}
</span>
402 <span id=
"L338" class=
"LineNr">338 </span> <span class=
"PreProc">return
</span> n
403 <span id=
"L339" class=
"LineNr">339 </span><span class=
"Delimiter">}
</span>
404 <span id=
"L340" class=
"LineNr">340 </span>
405 <span id=
"L341" class=
"LineNr">341 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L341'
>halve-array-of-decimal-digits
</a></span> _buf: (addr array byte), _n: int, _dp: int
<span class=
"PreProc"> -
> </span>_/eax: int, _/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Delimiter">{
</span>
406 <span id=
"L342" class=
"LineNr">342 </span> <span class=
"PreProc">var
</span> buf/
<span class=
"muRegEdi">edi
</span>: (addr array byte)
<span class=
"Special"><-
</span> copy _buf
407 <span id=
"L343" class=
"LineNr">343 </span> <span class=
"PreProc">var
</span> n/eax: int
<span class=
"Special"><-
</span> copy _n
408 <span id=
"L344" class=
"LineNr">344 </span> <span class=
"PreProc">var
</span> dp/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy _dp
409 <span id=
"L345" class=
"LineNr">345 </span> <span class=
"muComment"># initialize one side
</span>
410 <span id=
"L346" class=
"LineNr">346 </span> <span class=
"Delimiter">{
</span>
411 <span id=
"L347" class=
"LineNr">347 </span> <span class=
"muComment"># if buf[n-
1]%
2 ==
0, break
</span>
412 <span id=
"L348" class=
"LineNr">348 </span> <span class=
"PreProc">var
</span> right-index/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy n
413 <span id=
"L349" class=
"LineNr">349 </span> right-index
<span class=
"Special"><-
</span> decrement
414 <span id=
"L350" class=
"LineNr">350 </span> <span class=
"PreProc">var
</span> right-a/
<span class=
"muRegEcx">ecx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, right-index
415 <span id=
"L351" class=
"LineNr">351 </span> <span class=
"PreProc">var
</span> right/
<span class=
"muRegEcx">ecx
</span>: byte
<span class=
"Special"><-
</span> copy-byte *right-a
416 <span id=
"L352" class=
"LineNr">352 </span> <span class=
"PreProc">var
</span> right-int/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy right
417 <span id=
"L353" class=
"LineNr">353 </span> <span class=
"PreProc">var
</span> remainder/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
418 <span id=
"L354" class=
"LineNr">354 </span> <span class=
"Delimiter">{
</span>
419 <span id=
"L355" class=
"LineNr">355 </span> <span class=
"PreProc">var
</span> dummy/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
420 <span id=
"L356" class=
"LineNr">356 </span> dummy, remainder
<span class=
"Special"><-
</span> <a href='
314divide.subx.html#L3'
>integer-divide
</a> right-int,
<span class=
"Constant">2</span>
421 <span id=
"L357" class=
"LineNr">357 </span> <span class=
"Delimiter">}
</span>
422 <span id=
"L358" class=
"LineNr">358 </span> compare remainder,
<span class=
"Constant">0</span>
423 <span id=
"L359" class=
"LineNr">359 </span> <span class=
"PreProc">break-if-=
</span>
424 <span id=
"L360" class=
"LineNr">360 </span> <span class=
"muComment"># buf[n] =
0</span>
425 <span id=
"L361" class=
"LineNr">361 </span> <span class=
"PreProc">var
</span> next-a/
<span class=
"muRegEcx">ecx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, n
426 <span id=
"L362" class=
"LineNr">362 </span> <span class=
"PreProc">var
</span> zero/
<span class=
"muRegEdx">edx
</span>: byte
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
427 <span id=
"L363" class=
"LineNr">363 </span> copy-byte-to *next-a, zero
428 <span id=
"L364" class=
"LineNr">364 </span> <span class=
"muComment"># n++
</span>
429 <span id=
"L365" class=
"LineNr">365 </span> n
<span class=
"Special"><-
</span> increment
430 <span id=
"L366" class=
"LineNr">366 </span> <span class=
"Delimiter">}
</span>
431 <span id=
"L367" class=
"LineNr">367 </span> <span class=
"muComment"># initialize the other
</span>
432 <span id=
"L368" class=
"LineNr">368 </span> <span class=
"PreProc">var
</span> delta/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
433 <span id=
"L369" class=
"LineNr">369 </span> <span class=
"PreProc">var
</span> x/
<span class=
"muRegEsi">esi
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
434 <span id=
"L370" class=
"LineNr">370 </span> <span class=
"Delimiter">{
</span>
435 <span id=
"L371" class=
"LineNr">371 </span> <span class=
"muComment"># if buf[
0]
>=
2, break
</span>
436 <span id=
"L372" class=
"LineNr">372 </span> <span class=
"PreProc">var
</span> left/
<span class=
"muRegEcx">ecx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf,
<span class=
"Constant">0</span>
437 <span id=
"L373" class=
"LineNr">373 </span> <span class=
"PreProc">var
</span> src/
<span class=
"muRegEcx">ecx
</span>: byte
<span class=
"Special"><-
</span> copy-byte *left
438 <span id=
"L374" class=
"LineNr">374 </span> compare src,
<span class=
"Constant">2</span>
439 <span id=
"L375" class=
"LineNr">375 </span> <span class=
"PreProc">break-if-
>=
</span>
440 <span id=
"L376" class=
"LineNr">376 </span> <span class=
"muComment"># delta, x =
1, buf[
0]
</span>
441 <span id=
"L377" class=
"LineNr">377 </span> delta
<span class=
"Special"><-
</span> copy
<span class=
"Constant">1</span>
442 <span id=
"L378" class=
"LineNr">378 </span> x
<span class=
"Special"><-
</span> copy src
443 <span id=
"L379" class=
"LineNr">379 </span> <span class=
"muComment"># n--
</span>
444 <span id=
"L380" class=
"LineNr">380 </span> n
<span class=
"Special"><-
</span> decrement
445 <span id=
"L381" class=
"LineNr">381 </span> <span class=
"muComment"># dp--
</span>
446 <span id=
"L382" class=
"LineNr">382 </span> dp
<span class=
"Special"><-
</span> decrement
447 <span id=
"L383" class=
"LineNr">383 </span> <span class=
"Delimiter">}
</span>
448 <span id=
"L384" class=
"LineNr">384 </span> <span class=
"muComment"># loop
</span>
449 <span id=
"L385" class=
"LineNr">385 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
450 <span id=
"L386" class=
"LineNr">386 </span> <span class=
"Delimiter">{
</span>
451 <span id=
"L387" class=
"LineNr">387 </span> compare i, n
452 <span id=
"L388" class=
"LineNr">388 </span> <span class=
"PreProc">break-if-
>=
</span>
453 <span id=
"L389" class=
"LineNr">389 </span> <span class=
"muComment"># x = x*
10 + buf[i+delta]
</span>
454 <span id=
"L390" class=
"LineNr">390 </span> <span class=
"Delimiter">{
</span>
455 <span id=
"L391" class=
"LineNr">391 </span> <span class=
"PreProc">var
</span> ten/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0xa</span>
456 <span id=
"L392" class=
"LineNr">392 </span> x
<span class=
"Special"><-
</span> multiply ten
457 <span id=
"L393" class=
"LineNr">393 </span> <span class=
"PreProc">var
</span> src-index/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy i
458 <span id=
"L394" class=
"LineNr">394 </span> src-index
<span class=
"Special"><-
</span> add delta
459 <span id=
"L395" class=
"LineNr">395 </span> <span class=
"PreProc">var
</span> src-a/
<span class=
"muRegEdx">edx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, src-index
460 <span id=
"L396" class=
"LineNr">396 </span> <span class=
"PreProc">var
</span> src/
<span class=
"muRegEdx">edx
</span>: byte
<span class=
"Special"><-
</span> copy-byte *src-a
461 <span id=
"L397" class=
"LineNr">397 </span> x
<span class=
"Special"><-
</span> add src
462 <span id=
"L398" class=
"LineNr">398 </span> <span class=
"Delimiter">}
</span>
463 <span id=
"L399" class=
"LineNr">399 </span> <span class=
"muComment"># buf[i], x = x/
2, x%
2</span>
464 <span id=
"L400" class=
"LineNr">400 </span> <span class=
"Delimiter">{
</span>
465 <span id=
"L401" class=
"LineNr">401 </span> <span class=
"PreProc">var
</span> quotient/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
466 <span id=
"L402" class=
"LineNr">402 </span> <span class=
"PreProc">var
</span> remainder/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
467 <span id=
"L403" class=
"LineNr">403 </span> quotient, remainder
<span class=
"Special"><-
</span> <a href='
314divide.subx.html#L3'
>integer-divide
</a> x,
<span class=
"Constant">2</span>
468 <span id=
"L404" class=
"LineNr">404 </span> x
<span class=
"Special"><-
</span> copy remainder
469 <span id=
"L405" class=
"LineNr">405 </span> <span class=
"PreProc">var
</span> dest/
<span class=
"muRegEdx">edx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, i
470 <span id=
"L406" class=
"LineNr">406 </span> copy-byte-to *dest, quotient
471 <span id=
"L407" class=
"LineNr">407 </span> <span class=
"Delimiter">}
</span>
472 <span id=
"L408" class=
"LineNr">408 </span> <span class=
"muComment">#
</span>
473 <span id=
"L409" class=
"LineNr">409 </span> i
<span class=
"Special"><-
</span> increment
474 <span id=
"L410" class=
"LineNr">410 </span> <span class=
"PreProc">loop
</span>
475 <span id=
"L411" class=
"LineNr">411 </span> <span class=
"Delimiter">}
</span>
476 <span id=
"L412" class=
"LineNr">412 </span> <span class=
"PreProc">return
</span> n, dp
477 <span id=
"L413" class=
"LineNr">413 </span><span class=
"Delimiter">}
</span>
478 <span id=
"L414" class=
"LineNr">414 </span>
479 <span id=
"L415" class=
"LineNr">415 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L415'
>_write-float-array-of-decimal-digits
</a></span> out: (addr stream byte), _buf: (addr array byte), n: int, dp: int, precision: int
<span class=
"Delimiter">{
</span>
480 <span id=
"L416" class=
"LineNr">416 </span> <span class=
"PreProc">var
</span> buf/
<span class=
"muRegEdi">edi
</span>: (addr array byte)
<span class=
"Special"><-
</span> copy _buf
481 <span id=
"L417" class=
"LineNr">417 </span> <span class=
"Delimiter">{
</span>
482 <span id=
"L418" class=
"LineNr">418 </span> compare dp,
<span class=
"Constant">0</span>
483 <span id=
"L419" class=
"LineNr">419 </span> <span class=
"PreProc">break-if-
>=
</span>
484 <span id=
"L420" class=
"LineNr">420 </span> <a href='
412render-float-decimal.mu.html#L464'
>_write-float-array-of-decimal-digits-in-scientific-notation
</a> out, buf, n, dp, precision
485 <span id=
"L421" class=
"LineNr">421 </span> <span class=
"PreProc">return
</span>
486 <span id=
"L422" class=
"LineNr">422 </span> <span class=
"Delimiter">}
</span>
487 <span id=
"L423" class=
"LineNr">423 </span> <span class=
"Delimiter">{
</span>
488 <span id=
"L424" class=
"LineNr">424 </span> <span class=
"PreProc">var
</span> dp2/eax: int
<span class=
"Special"><-
</span> copy dp
489 <span id=
"L425" class=
"LineNr">425 </span> compare dp2, precision
490 <span id=
"L426" class=
"LineNr">426 </span> <span class=
"PreProc">break-if-
<=
</span>
491 <span id=
"L427" class=
"LineNr">427 </span> <a href='
412render-float-decimal.mu.html#L464'
>_write-float-array-of-decimal-digits-in-scientific-notation
</a> out, buf, n, dp, precision
492 <span id=
"L428" class=
"LineNr">428 </span> <span class=
"PreProc">return
</span>
493 <span id=
"L429" class=
"LineNr">429 </span> <span class=
"Delimiter">}
</span>
494 <span id=
"L430" class=
"LineNr">430 </span> <span class=
"Delimiter">{
</span>
495 <span id=
"L431" class=
"LineNr">431 </span> compare dp,
<span class=
"Constant">0</span>
496 <span id=
"L432" class=
"LineNr">432 </span> <span class=
"PreProc">break-if-!=
</span>
497 <span id=
"L433" class=
"LineNr">433 </span> <a href='
115write-byte.subx.html#L12'
>append-byte
</a> out,
<span class=
"Constant">0x30</span>/
<span class=
"Constant">0</span>
498 <span id=
"L434" class=
"LineNr">434 </span> <span class=
"Delimiter">}
</span>
499 <span id=
"L435" class=
"LineNr">435 </span> <span class=
"PreProc">var
</span> i/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
500 <span id=
"L436" class=
"LineNr">436 </span> <span class=
"muComment"># bounds = min(n, dp+
3)
</span>
501 <span id=
"L437" class=
"LineNr">437 </span> <span class=
"PreProc">var
</span> limit/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy dp
502 <span id=
"L438" class=
"LineNr">438 </span> limit
<span class=
"Special"><-
</span> add
<span class=
"Constant">3</span>
503 <span id=
"L439" class=
"LineNr">439 </span> <span class=
"Delimiter">{
</span>
504 <span id=
"L440" class=
"LineNr">440 </span> compare limit, n
505 <span id=
"L441" class=
"LineNr">441 </span> <span class=
"PreProc">break-if-
<=
</span>
506 <span id=
"L442" class=
"LineNr">442 </span> limit
<span class=
"Special"><-
</span> copy n
507 <span id=
"L443" class=
"LineNr">443 </span> <span class=
"Delimiter">}
</span>
508 <span id=
"L444" class=
"LineNr">444 </span> <span class=
"Delimiter">{
</span>
509 <span id=
"L445" class=
"LineNr">445 </span> compare i, limit
510 <span id=
"L446" class=
"LineNr">446 </span> <span class=
"PreProc">break-if-
>=
</span>
511 <span id=
"L447" class=
"LineNr">447 </span> <span class=
"muComment"># print '.' if necessary
</span>
512 <span id=
"L448" class=
"LineNr">448 </span> compare i, dp
513 <span id=
"L449" class=
"LineNr">449 </span> <span class=
"Delimiter">{
</span>
514 <span id=
"L450" class=
"LineNr">450 </span> <span class=
"PreProc">break-if-!=
</span>
515 <span id=
"L451" class=
"LineNr">451 </span> <a href='
115write-byte.subx.html#L12'
>append-byte
</a> out,
<span class=
"Constant">0x2e</span>/decimal-point
516 <span id=
"L452" class=
"LineNr">452 </span> <span class=
"Delimiter">}
</span>
517 <span id=
"L453" class=
"LineNr">453 </span> <span class=
"PreProc">var
</span> curr-a/
<span class=
"muRegEcx">ecx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, i
518 <span id=
"L454" class=
"LineNr">454 </span> <span class=
"PreProc">var
</span> curr/
<span class=
"muRegEcx">ecx
</span>: byte
<span class=
"Special"><-
</span> copy-byte *curr-a
519 <span id=
"L455" class=
"LineNr">455 </span> <span class=
"PreProc">var
</span> curr-int/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy curr
520 <span id=
"L456" class=
"LineNr">456 </span> curr-int
<span class=
"Special"><-
</span> add
<span class=
"Constant">0x30</span>/
<span class=
"Constant">0</span>
521 <span id=
"L457" class=
"LineNr">457 </span> <a href='
115write-byte.subx.html#L12'
>append-byte
</a> out, curr-int
522 <span id=
"L458" class=
"LineNr">458 </span> <span class=
"muComment">#
</span>
523 <span id=
"L459" class=
"LineNr">459 </span> i
<span class=
"Special"><-
</span> increment
524 <span id=
"L460" class=
"LineNr">460 </span> <span class=
"PreProc">loop
</span>
525 <span id=
"L461" class=
"LineNr">461 </span> <span class=
"Delimiter">}
</span>
526 <span id=
"L462" class=
"LineNr">462 </span><span class=
"Delimiter">}
</span>
527 <span id=
"L463" class=
"LineNr">463 </span>
528 <span id=
"L464" class=
"LineNr">464 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L464'
>_write-float-array-of-decimal-digits-in-scientific-notation
</a></span> out: (addr stream byte), _buf: (addr array byte), n: int, dp: int, precision: int
<span class=
"Delimiter">{
</span>
529 <span id=
"L465" class=
"LineNr">465 </span> <span class=
"PreProc">var
</span> buf/
<span class=
"muRegEdi">edi
</span>: (addr array byte)
<span class=
"Special"><-
</span> copy _buf
530 <span id=
"L466" class=
"LineNr">466 </span> <span class=
"PreProc">var
</span> i/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
531 <span id=
"L467" class=
"LineNr">467 </span> <span class=
"Delimiter">{
</span>
532 <span id=
"L468" class=
"LineNr">468 </span> compare i, n
533 <span id=
"L469" class=
"LineNr">469 </span> <span class=
"PreProc">break-if-
>=
</span>
534 <span id=
"L470" class=
"LineNr">470 </span> compare i, precision
535 <span id=
"L471" class=
"LineNr">471 </span> <span class=
"PreProc">break-if-
>=
</span>
536 <span id=
"L472" class=
"LineNr">472 </span> compare i,
<span class=
"Constant">1</span>
537 <span id=
"L473" class=
"LineNr">473 </span> <span class=
"Delimiter">{
</span>
538 <span id=
"L474" class=
"LineNr">474 </span> <span class=
"PreProc">break-if-!=
</span>
539 <span id=
"L475" class=
"LineNr">475 </span> <a href='
115write-byte.subx.html#L12'
>append-byte
</a> out,
<span class=
"Constant">0x2e</span>/decimal-point
540 <span id=
"L476" class=
"LineNr">476 </span> <span class=
"Delimiter">}
</span>
541 <span id=
"L477" class=
"LineNr">477 </span> <span class=
"PreProc">var
</span> curr-a/
<span class=
"muRegEcx">ecx
</span>: (addr byte)
<span class=
"Special"><-
</span> index buf, i
542 <span id=
"L478" class=
"LineNr">478 </span> <span class=
"PreProc">var
</span> curr/
<span class=
"muRegEcx">ecx
</span>: byte
<span class=
"Special"><-
</span> copy-byte *curr-a
543 <span id=
"L479" class=
"LineNr">479 </span> <span class=
"PreProc">var
</span> curr-int/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy curr
544 <span id=
"L480" class=
"LineNr">480 </span> curr-int
<span class=
"Special"><-
</span> add
<span class=
"Constant">0x30</span>/
<span class=
"Constant">0</span>
545 <span id=
"L481" class=
"LineNr">481 </span> <a href='
115write-byte.subx.html#L12'
>append-byte
</a> out, curr-int
546 <span id=
"L482" class=
"LineNr">482 </span> <span class=
"muComment">#
</span>
547 <span id=
"L483" class=
"LineNr">483 </span> i
<span class=
"Special"><-
</span> increment
548 <span id=
"L484" class=
"LineNr">484 </span> <span class=
"PreProc">loop
</span>
549 <span id=
"L485" class=
"LineNr">485 </span> <span class=
"Delimiter">}
</span>
550 <span id=
"L486" class=
"LineNr">486 </span> <a href='
115write-byte.subx.html#L12'
>append-byte
</a> out,
<span class=
"Constant">0x65</span>/e
551 <span id=
"L487" class=
"LineNr">487 </span> decrement dp
552 <span id=
"L488" class=
"LineNr">488 </span> <a href='
126write-int-decimal.subx.html#L8'
>write-int32-decimal
</a> out, dp
553 <span id=
"L489" class=
"LineNr">489 </span><span class=
"Delimiter">}
</span>
554 <span id=
"L490" class=
"LineNr">490 </span>
555 <span id=
"L491" class=
"LineNr">491 </span><span class=
"muComment"># follows the structure of write-float-decimal-approximate
</span>
556 <span id=
"L492" class=
"LineNr">492 </span><span class=
"muComment"># 'precision' controls the maximum width past which we resort to scientific notation
</span>
557 <span id=
"L493" class=
"LineNr">493 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
412render-float-decimal.mu.html#L493'
>float-size
</a></span> in: float, precision: int
<span class=
"PreProc"> -
> </span>_/eax: int
<span class=
"Delimiter">{
</span>
558 <span id=
"L494" class=
"LineNr">494 </span> <span class=
"muComment"># - special names
</span>
559 <span id=
"L495" class=
"LineNr">495 </span> <span class=
"PreProc">var
</span> bits/eax: int
<span class=
"Special"><-
</span> reinterpret in
560 <span id=
"L496" class=
"LineNr">496 </span> compare bits,
<span class=
"Constant">0</span>
561 <span id=
"L497" class=
"LineNr">497 </span> <span class=
"Delimiter">{
</span>
562 <span id=
"L498" class=
"LineNr">498 </span> <span class=
"PreProc">break-if-!=
</span>
563 <span id=
"L499" class=
"LineNr">499 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">1</span> <span class=
"muComment"># for
"0"</span>
564 <span id=
"L500" class=
"LineNr">500 </span> <span class=
"Delimiter">}
</span>
565 <span id=
"L501" class=
"LineNr">501 </span> compare bits,
<span class=
"Constant">0x80000000</span>
566 <span id=
"L502" class=
"LineNr">502 </span> <span class=
"Delimiter">{
</span>
567 <span id=
"L503" class=
"LineNr">503 </span> <span class=
"PreProc">break-if-!=
</span>
568 <span id=
"L504" class=
"LineNr">504 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">2</span> <span class=
"muComment"># for
"-
0"</span>
569 <span id=
"L505" class=
"LineNr">505 </span> <span class=
"Delimiter">}
</span>
570 <span id=
"L506" class=
"LineNr">506 </span> compare bits,
<span class=
"Constant">0x7f800000</span>
571 <span id=
"L507" class=
"LineNr">507 </span> <span class=
"Delimiter">{
</span>
572 <span id=
"L508" class=
"LineNr">508 </span> <span class=
"PreProc">break-if-!=
</span>
573 <span id=
"L509" class=
"LineNr">509 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">3</span> <span class=
"muComment"># for
"Inf
"</span>
574 <span id=
"L510" class=
"LineNr">510 </span> <span class=
"Delimiter">}
</span>
575 <span id=
"L511" class=
"LineNr">511 </span> compare bits,
<span class=
"Constant">0xff800000</span>
576 <span id=
"L512" class=
"LineNr">512 </span> <span class=
"Delimiter">{
</span>
577 <span id=
"L513" class=
"LineNr">513 </span> <span class=
"PreProc">break-if-!=
</span>
578 <span id=
"L514" class=
"LineNr">514 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">4</span> <span class=
"muComment"># for
"-Inf
"</span>
579 <span id=
"L515" class=
"LineNr">515 </span> <span class=
"Delimiter">}
</span>
580 <span id=
"L516" class=
"LineNr">516 </span> <span class=
"PreProc">var
</span> exponent/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy bits
581 <span id=
"L517" class=
"LineNr">517 </span> exponent
<span class=
"Special"><-
</span> shift-right
<span class=
"Constant">0x17</span> <span class=
"muComment">#
23 bits of mantissa
</span>
582 <span id=
"L518" class=
"LineNr">518 </span> exponent
<span class=
"Special"><-
</span> and
<span class=
"Constant">0xff</span>
583 <span id=
"L519" class=
"LineNr">519 </span> exponent
<span class=
"Special"><-
</span> subtract
<span class=
"Constant">0x7f</span>
584 <span id=
"L520" class=
"LineNr">520 </span> compare exponent,
<span class=
"Constant">0x80</span>
585 <span id=
"L521" class=
"LineNr">521 </span> <span class=
"Delimiter">{
</span>
586 <span id=
"L522" class=
"LineNr">522 </span> <span class=
"PreProc">break-if-!=
</span>
587 <span id=
"L523" class=
"LineNr">523 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">3</span> <span class=
"muComment"># for
"NaN
"</span>
588 <span id=
"L524" class=
"LineNr">524 </span> <span class=
"Delimiter">}
</span>
589 <span id=
"L525" class=
"LineNr">525 </span> <span class=
"muComment"># - regular numbers
</span>
590 <span id=
"L526" class=
"LineNr">526 </span> <span class=
"muComment"># v =
1.mantissa (in base
2)
<< 0x17</span>
591 <span id=
"L527" class=
"LineNr">527 </span> <span class=
"PreProc">var
</span> v/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy bits
592 <span id=
"L528" class=
"LineNr">528 </span> v
<span class=
"Special"><-
</span> and
<span class=
"Constant">0x7fffff</span>
593 <span id=
"L529" class=
"LineNr">529 </span> v
<span class=
"Special"><-
</span> or
<span class=
"Constant">0x00800000</span> <span class=
"muComment"># insert implicit
1</span>
594 <span id=
"L530" class=
"LineNr">530 </span> <span class=
"muComment"># e = exponent -
0x17</span>
595 <span id=
"L531" class=
"LineNr">531 </span> <span class=
"PreProc">var
</span> e/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy exponent
596 <span id=
"L532" class=
"LineNr">532 </span> e
<span class=
"Special"><-
</span> subtract
<span class=
"Constant">0x17</span> <span class=
"muComment"># move decimal place from before mantissa to after
</span>
597 <span id=
"L533" class=
"LineNr">533 </span>
598 <span id=
"L534" class=
"LineNr">534 </span> <span class=
"muComment"># initialize buffer with decimal representation of v
</span>
599 <span id=
"L535" class=
"LineNr">535 </span> <span class=
"PreProc">var
</span> buf-storage: (array byte
<span class=
"Constant">0x7f</span>)
600 <span id=
"L536" class=
"LineNr">536 </span> <span class=
"PreProc">var
</span> buf/
<span class=
"muRegEdi">edi
</span>: (addr array byte)
<span class=
"Special"><-
</span> address buf-storage
601 <span id=
"L537" class=
"LineNr">537 </span> <span class=
"PreProc">var
</span> n/eax: int
<span class=
"Special"><-
</span> <a href='
412render-float-decimal.mu.html#L251'
>decimal-digits
</a> v, buf
602 <span id=
"L538" class=
"LineNr">538 </span> <a href='
412render-float-decimal.mu.html#L268'
>reverse-digits
</a> buf, n
603 <span id=
"L539" class=
"LineNr">539 </span>
604 <span id=
"L540" class=
"LineNr">540 </span> <span class=
"muComment"># loop if e
> 0</span>
605 <span id=
"L541" class=
"LineNr">541 </span> <span class=
"Delimiter">{
</span>
606 <span id=
"L542" class=
"LineNr">542 </span> compare e,
<span class=
"Constant">0</span>
607 <span id=
"L543" class=
"LineNr">543 </span> <span class=
"PreProc">break-if-
<=
</span>
608 <span id=
"L544" class=
"LineNr">544 </span> n
<span class=
"Special"><-
</span> <a href='
412render-float-decimal.mu.html#L290'
>double-array-of-decimal-digits
</a> buf, n
609 <span id=
"L545" class=
"LineNr">545 </span> e
<span class=
"Special"><-
</span> decrement
610 <span id=
"L546" class=
"LineNr">546 </span> <span class=
"PreProc">loop
</span>
611 <span id=
"L547" class=
"LineNr">547 </span> <span class=
"Delimiter">}
</span>
612 <span id=
"L548" class=
"LineNr">548 </span>
613 <span id=
"L549" class=
"LineNr">549 </span> <span class=
"PreProc">var
</span> dp/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy n
614 <span id=
"L550" class=
"LineNr">550 </span>
615 <span id=
"L551" class=
"LineNr">551 </span> <span class=
"muComment"># loop if e
< 0</span>
616 <span id=
"L552" class=
"LineNr">552 </span> <span class=
"Delimiter">{
</span>
617 <span id=
"L553" class=
"LineNr">553 </span> compare e,
<span class=
"Constant">0</span>
618 <span id=
"L554" class=
"LineNr">554 </span> <span class=
"PreProc">break-if-
>=
</span>
619 <span id=
"L555" class=
"LineNr">555 </span> n, dp
<span class=
"Special"><-
</span> <a href='
412render-float-decimal.mu.html#L341'
>halve-array-of-decimal-digits
</a> buf, n, dp
620 <span id=
"L556" class=
"LineNr">556 </span> e
<span class=
"Special"><-
</span> increment
621 <span id=
"L557" class=
"LineNr">557 </span> <span class=
"PreProc">loop
</span>
622 <span id=
"L558" class=
"LineNr">558 </span> <span class=
"Delimiter">}
</span>
623 <span id=
"L559" class=
"LineNr">559 </span>
624 <span id=
"L560" class=
"LineNr">560 </span> compare dp,
<span class=
"Constant">0</span>
625 <span id=
"L561" class=
"LineNr">561 </span> <span class=
"Delimiter">{
</span>
626 <span id=
"L562" class=
"LineNr">562 </span> <span class=
"PreProc">break-if-
>=
</span>
627 <span id=
"L563" class=
"LineNr">563 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">8</span> <span class=
"muComment"># hacky for scientific notation
</span>
628 <span id=
"L564" class=
"LineNr">564 </span> <span class=
"Delimiter">}
</span>
629 <span id=
"L565" class=
"LineNr">565 </span> <span class=
"Delimiter">{
</span>
630 <span id=
"L566" class=
"LineNr">566 </span> <span class=
"PreProc">var
</span> dp2/eax: int
<span class=
"Special"><-
</span> copy dp
631 <span id=
"L567" class=
"LineNr">567 </span> compare dp2, precision
632 <span id=
"L568" class=
"LineNr">568 </span> <span class=
"PreProc">break-if-
<=
</span>
633 <span id=
"L569" class=
"LineNr">569 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">8</span> <span class=
"muComment"># hacky for scientific notation
</span>
634 <span id=
"L570" class=
"LineNr">570 </span> <span class=
"Delimiter">}
</span>
635 <span id=
"L571" class=
"LineNr">571 </span>
636 <span id=
"L572" class=
"LineNr">572 </span> <span class=
"muComment"># result = min(n, dp+
3)
</span>
637 <span id=
"L573" class=
"LineNr">573 </span> <span class=
"PreProc">var
</span> result/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy dp
638 <span id=
"L574" class=
"LineNr">574 </span> result
<span class=
"Special"><-
</span> add
<span class=
"Constant">3</span>
639 <span id=
"L575" class=
"LineNr">575 </span> <span class=
"Delimiter">{
</span>
640 <span id=
"L576" class=
"LineNr">576 </span> compare result, n
641 <span id=
"L577" class=
"LineNr">577 </span> <span class=
"PreProc">break-if-
<=
</span>
642 <span id=
"L578" class=
"LineNr">578 </span> result
<span class=
"Special"><-
</span> copy n
643 <span id=
"L579" class=
"LineNr">579 </span> <span class=
"Delimiter">}
</span>
644 <span id=
"L580" class=
"LineNr">580 </span>
645 <span id=
"L581" class=
"LineNr">581 </span> <span class=
"muComment"># account for decimal point
</span>
646 <span id=
"L582" class=
"LineNr">582 </span> compare dp, n
647 <span id=
"L583" class=
"LineNr">583 </span> <span class=
"Delimiter">{
</span>
648 <span id=
"L584" class=
"LineNr">584 </span> <span class=
"PreProc">break-if-
>=
</span>
649 <span id=
"L585" class=
"LineNr">585 </span> result
<span class=
"Special"><-
</span> increment
650 <span id=
"L586" class=
"LineNr">586 </span> <span class=
"Delimiter">}
</span>
651 <span id=
"L587" class=
"LineNr">587 </span>
652 <span id=
"L588" class=
"LineNr">588 </span> <span class=
"muComment"># account for sign
</span>
653 <span id=
"L589" class=
"LineNr">589 </span> <span class=
"PreProc">var
</span> sign/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> reinterpret in
654 <span id=
"L590" class=
"LineNr">590 </span> sign
<span class=
"Special"><-
</span> shift-right
<span class=
"Constant">0x1f</span>
655 <span id=
"L591" class=
"LineNr">591 </span> <span class=
"Delimiter">{
</span>
656 <span id=
"L592" class=
"LineNr">592 </span> compare sign,
<span class=
"Constant">1</span>
657 <span id=
"L593" class=
"LineNr">593 </span> <span class=
"PreProc">break-if-!=
</span>
658 <span id=
"L594" class=
"LineNr">594 </span> result
<span class=
"Special"><-
</span> increment
659 <span id=
"L595" class=
"LineNr">595 </span> <span class=
"Delimiter">}
</span>
660 <span id=
"L596" class=
"LineNr">596 </span> <span class=
"PreProc">return
</span> result
661 <span id=
"L597" class=
"LineNr">597 </span><span class=
"Delimiter">}
</span>
665 <!-- vim: set foldmethod=manual : -->