我正在寻找一种在XSLT1.0中计算具有十进制指数的数字的幂的解决方案。目前,我使用的计算方法只计算非十进制指数的幂。这是我目前使用的模板:
<xsl:call-template name="Pow">
<xsl:with-param name="Base" select="10"/>
<xsl:with-param name="Exponent" select="2"/>
<xsl:with-param name="Result" select="1"/>
</xsl:call-template>
<xsl:template name="Pow"> <!-- TODO: Handle decimal exponents -->
<xsl:param name="Base"/>
<xsl:param name="Exponent"/>
<xsl:param name="Result"/>
<xsl:choose>
<xsl:when test="$Exponent = 0">
<xsl:value-of select="1"/>
</xsl:when>
<xsl:when test="$Exponent = 1">
<xsl:value-of select="$Result * $Base"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="Pow">
<xsl:with-param name="Base" select="$Base"/>
<xsl:with-param name="Exponent" select="$Exponent - 1"/>
<xsl:with-param name="Result" select="$Result * $Base"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我不一定需要一个广义的解决方案。我只需要找到一个幂为2.4
的数字的值。
我试着把我的问题分解如下:
x ^ (2.4) = (x ^ 2) * (x ^ 0.4)
= (x ^ 2) * (x ^ (2/5))
= (x ^ 2) * ((x ^ 2) ^ 1/5)
求x
的平方是可以的,所以我的问题分解为计算一个数字的"第五根"。
我也想过把我的问题分解成对数方程,但没有达到任何目的。
我正在考虑写一个代码来实现计算根的长除数方法,但这似乎效率很低,也不优雅。
有人能给我一个更简单有效的解决问题的方法吗?如果没有,那么有人尝试过编码计算根的长除数方法吗?
提前感谢!!
注意:这是一个我在执行中会多次使用的模板,因此效率对我来说更加重要。
您的处理器不支持EXSLT math:power()扩展函数吗?以下样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="http://exslt.org/math"
extension-element-prefixes="math">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="num" select="32" />
<xsl:template match="/">
<output>
<xsl:value-of select="math:power($num, 2.4)" />
</output>
</xsl:template>
</xsl:stylesheet>
将返回:
libxslt:
<?xml version="1.0" encoding="UTF-8"?>
<output>4096</output>
撒克逊6.5/Xalan:
<?xml version="1.0" encoding="UTF-8"?>
<output>4095.9999999999986</output>