3

Math.pow(), pow(), 不管叫什么,很多语言(和计算器)都有一些内置函数来计算浮点数(或双精度数)的 x=a^b。有 a 为负数且 b 不是整数的特殊情况。有些会返回NaN,有些会给出复杂的结果(咳咳 Python)。但有些实际上能够给出真正的结果,所以我想知道的是如何。为了解释我的困惑:

假设 b 是有理数:b=c/d。现在我们看一下 c 和 d 的奇偶校验:

  • d 是偶数:没有实数 x -> NaN 或错误

  • d 是奇数,c 是偶数:正 x

  • d 是奇数,c 是奇数:负 x

浮点数以特定格式存储,这意味着如果按字面解释,它始终是偶数 d(实际上是 2 的幂)。没有办法知道 c 和 d 的真实奇偶性,因为该信息在计算中丢失了。它只需要猜测。

所以我猜测它在做什么——它试图找到一个接近 b 的理性 c/d,奇数 d 并且 c 和 d 都小于某个阈值 t。较小的 t 意味着它可以更确定它是正确的,但它会在更少的数字上起作用。如果成功,它使用 c 的奇偶校验。否则它假装 d 是偶数。毕竟,浮点数可以是任何东西,数学库不想通过假设它可能不是合理的而给出可能错误的结果。

这只是我的猜测。如果有人真正看到了这些幂函数之一的代码(或规范,那也很好)并且可以提供洞察力,那就太好了。

4

2 回答 2

1

第一眼:负指数平方的幂

现在假设and不是整数的x^y情况。如果你使用x<0y

x^y = exp2(y*log2(x))

那么你;受到log2定义范围的限制,因此NaNor |x|^y。如果你想要更好的东西,你可以尝试剖析y这种形式:

y = a/b

哪里a,b是整数。如果可能(或者如果应用了四舍五入),那么您将问题更改为:

x^y = (x^a)^(1/b)

所以现在您可以处理更多案例(完全按照您的建议):

  1. if ais even sub-result 不再为负

    x^a>=0这样(x^a)^(1/b)>=0

  2. 如果两者a,b都是奇数结果为负

  3. else result is NaNor use |x|^yinstead

现在回到您的float问题,数字始终采用这种形式:

y = mantissa*exp2(exponent)

所以 yesb是偶数(除非exponent!=0这意味着数字是整数)。Asmantissa存储为整数,您可以通过检查其LSB来获得其奇偶性。不要忘记在floatsMSB丢失并且总是应该丢失,1除非存在像反规范化或Nan/Inf数字这样的特殊情况

于 2017-08-26T07:53:34.480 回答
0

如果您准备作弊,以下是您可以对任何权力提出否定意见的方法:

x^(b/c)=x^(2b/2c)=(x^2b)^(1/2c)

x^2b是正数,所以取 2c-th 根没有问题

于 2017-08-27T07:47:27.080 回答