Xml XSLT限制中的阶乘?

Xml XSLT限制中的阶乘?,xml,internet-explorer,firefox,xslt,Xml,Internet Explorer,Firefox,Xslt,我在XSLT中实现了以下阶乘函数: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:apply-templates> &

我在XSLT中实现了以下阶乘函数:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:apply-templates>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="factorial" name="factorial">
        <xsl:param name="n" select="@n" />
        <xsl:param name="f" select="1" />
        <xsl:if test="$n &gt; 1">
            <xsl:call-template name="factorial">
                <xsl:with-param name="n">
                    <xsl:value-of select="$n - 1" />
                </xsl:with-param>
                <xsl:with-param name="f">
                    <xsl:value-of select="$f * $n" />
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
        <xsl:if test="$n = 1">
            <xsl:value-of select="$f" />
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

在Firefox和IE7中,
170工作正常,但
171仅返回
NaN
。这是XSLT/XPath数学中定义良好的限制,还是有办法获得更高的
n值

XPath规范
编号
类型如下:

数字表示浮点数。数字可以具有任意双精度64位格式的IEEE 754值


因此,界限是明确的。我还没有检查过,但考虑到171有多大!是的,您可能遇到了问题。

我想冒昧地猜测一下,您的问题取决于XSLT实现

这看起来像是一个标准的溢出问题。通过使用JavaScript阶乘实现复制问题,我发现了一个提示:


在另一种语言中,我会使用BigInteger库来处理如此大的数字。使用Google快速搜索[terms:XSLT BigInteger]会发现XSLT没有本机BigInteger类型。

除了XPath 1.0的正确答案之外,XPath 2.0中还有数据类型,xs:integer的绝对值没有最大值

实现BigInteger算法,并给出您的代码(添加xs:integer类型后略有更改):


+ 1我写了一个测试C++程序,在170时达到64位<代码>双< /代码>限制。我得到的是
inf
。170! = 7.3e306,双精度的最大值为1.8e308。
<xsl:template match="factorial" name="factorial">
    <xsl:param name="n" as="xs:integer"
     select="xs:integer(@n)" />
    <xsl:param name="f" as="xs:integer" select="1" />

    <xsl:if test="$n gt 1">
        <xsl:call-template name="factorial">
            <xsl:with-param name="n">
                <xsl:value-of select="$n - 1" />
            </xsl:with-param>
            <xsl:with-param name="f">
                <xsl:value-of select="$f * $n" />
            </xsl:with-param>
        </xsl:call-template>
    </xsl:if>
    <xsl:if test="$n = 1">
        <xsl:value-of select="$f" />
    </xsl:if>
</xsl:template>
<factorial n = "171"/>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
>
   <xsl:import href="../f/func-dvc-foldl.xsl"/>
   <xsl:import href="../f/func-Operators.xsl"/>

    <xsl:output  encoding="UTF-8" method="text"/>

    <xsl:template match="/">
      <xsl:value-of select="f:foldl(f:mult(), 1, 1 to 171)"/>
    </xsl:template>
</xsl:stylesheet>