Xml XSLT限制中的阶乘?
我在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> &
<?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 > 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>