This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: RE: sqrt ("pure" XSLT solution)
- To: <xsl-list at lists dot mulberrytech dot com>
- Subject: Re: [xsl] RE: sqrt ("pure" XSLT solution)
- From: "Kurt Cagle" <cagle at olywa dot net>
- Date: Mon, 13 Aug 2001 13:19:42 -0700
- References: <0E436C278A0AD511A3BE00B0D06896FC5F5F8E@clavin.decisionsys.com>
- Reply-To: xsl-list at lists dot mulberrytech dot com
Ah, Taylor sequences! You can use them for calculating sin() and cos()
values too (x - x^3/3! + x^5/5! - x^7/7! + ...) and (1 - x^2/2! + x^4/4! -
x^6/6! +...), and can get the tangent from sin()/cos(). Admittedly, your
accuracy is likely not to be great if you want anything approaching real
time computation, but usually you can get away with four terms of
calculation.
-- Kurt
----- Original Message -----
From: "Nate Austin" <naustin@idsgrp.com>
To: <xsl-list@lists.mulberrytech.com>
Sent: Monday, August 13, 2001 12:26 PM
Subject: [xsl] RE: sqrt ("pure" XSLT solution)
> > Date: Mon, 13 Aug 2001 00:44:34 -0700 (PDT)
> > From: edouard panie <edpanie@yahoo.com>
> > Subject: [none]
> >
> > Hi,
> >
> > I need to use a sqrt() math function in a XSL/SVG
> > style sheet. Knowing that I use a Saxon processor
> >
> > Here is the header I had before (when it worked!, but
> > with out sqrt()):
> >
> >
> > <?xml version="1.0" encoding="UTF-8"?>
> > <xsl:stylesheet version="1.0"
> > extension-element-prefixes="saxon"
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> > xmlns:saxon="http://icl.com/saxon">
> >
> >
> > I tried with EXSLT, I downloaded math.sqrt.msxsl.xsl
> > and math.sqrt.js, put them in the same directory as my
> > xsl stylesheet but it doesn't work!
> > This is what I tried, but when I run the saxon
> > processor, it gives errors: the processor doesn't
> > recognize the SVG tags anymore! I don't understand
> > what's wrong, can someone give me a hint?
> >
> >
> >
> > <?xml version="1.0" encoding="utf-8"?>
> > <stylesheet
> > xmlns="http://www.w3.org/1999/XSL/Transform"
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> > xmlns:saxon="http://icl.com/saxon"
> > xmlns:func="http://exslt.org/functions"
> > xmlns:math="http://exslt.org/math" version="1.0"
> > extension-element-prefixes="math func saxon"
> > math:doc="http://www.exslt.org/math">
> >
> > <import href="math.sqrt.msxsl.xsl"/>
> > <func:script language="exslt:javascript"
> > implements-prefix="math" src="math.sqrt.js"/>
> > <script implements-prefix="math" src="math.sqrt.js"
> > language="javascript"/>
> > </stylesheet>
> >
> >
> >
> >
> > Thanks for your help
> > Ed
>
> Ed -
>
> Here's a solution to your problem using an implementation of Newton's
method
> for finding square roots. Benefit: Processor independant (no extension
> functions)
> Drawback: Probably slightly slower, at times will leave a number hanging
on
> at the end (using the example I have here, 2761.5025 should return 52.55
but
> instead 52.550000000000004 is returned. This will mostly go away with a
> higher 'max iteration' count, but there may always be some special cases
> that should be rounded off.)
> Call it as shown below:
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:template match="/">
> <html><body>
> <xsl:call-template name="sqrt">
> <xsl:with-param name="num" select="2761.5025"/>
> </xsl:call-template>
> </body>
> </html>
> </xsl:template>
>
> <xsl:template name="sqrt">
> <xsl:param name="num" select="0"/> <!-- The number you want to find the
> square root of -->
> <xsl:param name="try" select="1"/> <!-- The current 'try'. This is
used
> internally. -->
> <xsl:param name="iter" select="1"/> <!-- The current iteration, checked
> against maxiter to limit loop count -->
> <xsl:param name="maxiter" select="10"/> <!-- Set this up to insure
> against infinite loops -->
>
> <!-- This template was written by Nate Austin using Sir Isaac Newton's
> method of finding roots -->
>
> <xsl:choose>
> <xsl:when test="$try * $try = $num or $iter > $maxiter">
> <xsl:value-of select="$try"/>
> </xsl:when>
> <xsl:otherwise>
> <xsl:call-template name="sqrt">
> <xsl:with-param name="num" select="$num"/>
> <xsl:with-param name="try" select="$try - (($try * $try - $num)
div
> (2 * $try))"/>
> <xsl:with-param name="iter" select="$iter + 1"/>
> <xsl:with-param name="maxiter" select="$maxiter"/>
> </xsl:call-template>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:template>
>
> </xsl:stylesheet>
>
>
> Here's the XML file I used to test it with IE5.5 + MSXML4 in replace mode:
>
> <?xml version="1.0"?>
> <?xml-stylesheet type="text/xsl" href="sqrt.xsl"?>
> <nub/>
>
> Hope that helps,
>
> Nate
> naustin@idsgrp.com
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list