xref: /aosp_15_r20/external/apache-xml/test/tests/contrib/xsltc/schemasoft/log10.xsl (revision 1212f9a0ffdc28482b8821715d2222bf16dc14e2)
1<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
2
3	<xsl:output method="text" />
4
5
6
7  <!-- FileName: log10.xsl -->
8
9  <!-- Author: Darryl Fuller, SchemaSoft -->
10
11  <!-- Purpose: Torture test, compute log10 recursivly for the a bunch of numbers -->
12
13
14
15
16
17	<xsl:template match="/">
18
19		<xsl:for-each select="./*/*/*/*">
20
21			<xsl:variable name="val" select="position()"/>
22
23			<xsl:variable name="logval">
24
25				<xsl:call-template name="log10">
26
27					<xsl:with-param name="x" select="$val"/>
28
29				</xsl:call-template>
30
31			</xsl:variable>
32
33Value: <xsl:value-of select="$val"/> Log10: <xsl:value-of select="$logval"/>
34
35		</xsl:for-each>
36
37	</xsl:template>
38
39
40
41	<xsl:template name="ln" >
42
43		<xsl:param name="x"/>
44
45		<xsl:variable name="e">2.71828182845904</xsl:variable>
46
47		<xsl:choose>
48
49			<xsl:when test="$x = 0">0</xsl:when>
50
51			<!-- technically, a negative number should be NaN, but we will
52
53		     instead pretend we're just scaling a negative number
54
55		     with the ln function -->
56
57			<xsl:when test="$x &lt; 0">
58
59				<xsl:variable name="scaled_answer">
60
61					<xsl:call-template name="ln">
62
63						<xsl:with-param name="x" select="$x * -1"/>
64
65					</xsl:call-template>
66
67				</xsl:variable>
68
69				<xsl:value-of select="$scaled_answer * -1"/>
70
71			</xsl:when>
72
73			<!-- A table of some common values -->
74
75			<xsl:when test="$x = 10">2.3025850929940</xsl:when>
76
77			<xsl:when test="$x = 20">2.9957322735539</xsl:when>
78
79			<xsl:when test="$x = 30">3.4011973816621</xsl:when>
80
81			<xsl:when test="$x = 40">3.6888794541139</xsl:when>
82
83			<xsl:when test="$x = 50">3.9120230054281</xsl:when>
84
85			<xsl:when test="$x = 60">4.0943445622221</xsl:when>
86
87			<xsl:when test="$x = 70">4.2484952420493</xsl:when>
88
89			<xsl:when test="$x = 80">4.3820266346738</xsl:when>
90
91			<xsl:when test="$x = 90">4.4998096703302</xsl:when>
92
93			<xsl:when test="$x = 100">4.6051701859881</xsl:when>
94
95			<xsl:when test="$x = 200">5.2983173665480</xsl:when>
96
97			<xsl:when test="$x = 300">5.7037824746562</xsl:when>
98
99			<xsl:when test="$x = 400">5.9914645471079</xsl:when>
100
101			<xsl:when test="$x = 500">6.2146080984222</xsl:when>
102
103			<xsl:when test="$x = 600">6.3969296552161</xsl:when>
104
105			<xsl:when test="$x = 700">6.5510803350434</xsl:when>
106
107			<xsl:when test="$x = 800">6.6846117276679</xsl:when>
108
109			<xsl:when test="$x = 900">6.8023947633243</xsl:when>
110
111			<xsl:when test="$x = 1000">6.90775527898213</xsl:when>
112
113			<!-- scale the answer -->
114
115			<xsl:when test="$x &gt; 20">
116
117				<xsl:variable name="scaled_answer">
118
119					<xsl:call-template name="ln">
120
121						<xsl:with-param name="x" select="$x div $e"/>
122
123					</xsl:call-template>
124
125				</xsl:variable>
126
127				<xsl:value-of select="$scaled_answer + 1"/>
128
129			</xsl:when>
130
131			<!-- scale the answer -->
132
133			<xsl:when test="$x &lt; 0.005">
134
135				<xsl:variable name="scaled_answer">
136
137					<xsl:call-template name="ln">
138
139						<xsl:with-param name="x" select="$x * $e"/>
140
141					</xsl:call-template>
142
143				</xsl:variable>
144
145				<xsl:value-of select="$scaled_answer - 1"/>
146
147			</xsl:when>
148
149			<!-- The straight goods -->
150
151			<xsl:otherwise>
152
153				<xsl:variable name="z">
154
155					<xsl:call-template name="z_value">
156
157						<xsl:with-param name="x" select="$x"/>
158
159					</xsl:call-template>
160
161				</xsl:variable>
162
163				<xsl:variable name="interim_answer">
164
165					<xsl:call-template name="ln_recurse">
166
167						<xsl:with-param name="z" select="$z"/>
168
169						<xsl:with-param name="current" select="0"/>
170
171						<xsl:with-param name="term" select="1"/>
172
173					</xsl:call-template>
174
175				</xsl:variable>
176
177				<xsl:value-of select="$interim_answer * 2"/>
178
179			</xsl:otherwise>
180
181		</xsl:choose>
182
183	</xsl:template>
184
185	<xsl:template name="z_value">
186
187		<xsl:param name="x"/>
188
189		<xsl:value-of select="($x - 1) div ($x + 1)"/>
190
191	</xsl:template>
192
193	<xsl:template name="ln_recurse">
194
195		<xsl:param name="z"/>
196
197		<xsl:param name="current"/>
198
199		<xsl:param name="term"/>
200
201		<xsl:variable name="term_value">
202
203			<xsl:call-template name="ln_term">
204
205				<xsl:with-param name="z" select="$z"/>
206
207				<xsl:with-param name="n" select="$term"/>
208
209			</xsl:call-template>
210
211		</xsl:variable>
212
213		<xsl:variable name="val" select="$current + $term_value"/>
214
215		<xsl:choose>
216
217			<xsl:when test="$val = $current">
218
219				<xsl:value-of select="$current"/>
220
221			</xsl:when>
222
223			<!-- Limiting the number of terms we calculate to is a trade
224
225		     off of accuracy v.s. speed.  I'm currently sacrificing
226
227		     accuracy for a bit o' speed to make this less painfully
228
229		     slow -->
230
231			<xsl:when test="$term &gt; 100">
232
233				<xsl:value-of select="$current"/>
234
235			</xsl:when>
236
237			<xsl:otherwise>
238
239				<xsl:call-template name="ln_recurse">
240
241					<xsl:with-param name="z" select="$z"/>
242
243					<xsl:with-param name="current" select="$val"/>
244
245					<xsl:with-param name="term" select="$term + 2"/>
246
247				</xsl:call-template>
248
249			</xsl:otherwise>
250
251		</xsl:choose>
252
253	</xsl:template>
254
255	<xsl:template name="ln_term">
256
257		<xsl:param name="z"/>
258
259		<xsl:param name="n"/>
260
261		<xsl:variable name="numerator">
262
263			<xsl:call-template name="pow_function">
264
265				<xsl:with-param name="number" select="$z"/>
266
267				<xsl:with-param name="power" select="$n"/>
268
269			</xsl:call-template>
270
271		</xsl:variable>
272
273		<xsl:value-of select="$numerator div $n"/>
274
275	</xsl:template>
276
277	<xsl:template name="pow_function" ><!-- Power function.
278
279	Calculates number ^ power where power is an
280
281	integer. -->
282
283		<xsl:param name="number"/>
284
285		<xsl:param name="power"/>
286
287
288
289		<xsl:variable name="int_power" select="round( $power )"/>
290
291		<xsl:variable name="rest">
292
293			<xsl:choose>
294
295				<xsl:when test="$int_power &gt; 0">
296
297					<xsl:call-template name="pow_function">
298
299						<xsl:with-param name="number" select="$number"/>
300
301						<xsl:with-param name="power" select="$int_power - 1"/>
302
303					</xsl:call-template>
304
305				</xsl:when>
306
307				<xsl:when test="$int_power &lt; 0">
308
309					<xsl:call-template name="pow_function">
310
311						<xsl:with-param name="number" select="$number"/>
312
313						<xsl:with-param name="power" select="$int_power + 1"/>
314
315					</xsl:call-template>
316
317				</xsl:when>
318
319				<xsl:otherwise>1</xsl:otherwise>
320
321			</xsl:choose>
322
323		</xsl:variable>
324
325		<xsl:variable name="result">
326
327			<xsl:choose>
328
329				<xsl:when test="$int_power &gt; 0">
330
331					<xsl:value-of select="$rest * $number"/>
332
333				</xsl:when>
334
335				<xsl:when test="$int_power &lt; 0">
336
337					<xsl:value-of select="$rest div $number"/>
338
339				</xsl:when>
340
341				<xsl:otherwise>
342
343				1
344
345			</xsl:otherwise>
346
347			</xsl:choose>
348
349		</xsl:variable>
350
351		<xsl:value-of select="$result"/>
352
353	</xsl:template>
354
355	<xsl:template name="log10"><!-- Log (base 10). -->
356
357		<xsl:param name="x"/>
358
359			<xsl:variable name="numerator">
360
361				<xsl:call-template name="ln">
362
363					<xsl:with-param name="x" select="$x"/>
364
365				</xsl:call-template>
366
367			</xsl:variable>
368
369			<!-- ln(10) -->
370
371			<xsl:variable name="denominator" select="2.302585092994045684"/>
372
373			<xsl:value-of select="$numerator div $denominator"/>
374
375	</xsl:template>
376
377  <!--
378   * Licensed to the Apache Software Foundation (ASF) under one
379   * or more contributor license agreements. See the NOTICE file
380   * distributed with this work for additional information
381   * regarding copyright ownership. The ASF licenses this file
382   * to you under the Apache License, Version 2.0 (the  "License");
383   * you may not use this file except in compliance with the License.
384   * You may obtain a copy of the License at
385   *
386   *     http://www.apache.org/licenses/LICENSE-2.0
387   *
388   * Unless required by applicable law or agreed to in writing, software
389   * distributed under the License is distributed on an "AS IS" BASIS,
390   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
391   * See the License for the specific language governing permissions and
392   * limitations under the License.
393  -->
394
395	</xsl:stylesheet>
396