功能函数处理负基数与非整数指数

时间:2017-08-26 00:39:32

标签: math floating-point rational-number

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

假设b是理性的:b = c / d。现在我们来看看c和d的奇偶校验:

  • d是偶数:没有真正的x - > NaN或错误

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

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

浮点数存储在a particular format中,这意味着如果它按字面解释它将永远是偶数d(实际上是2的幂)。由于该信息在计算中丢失,因此无法知道c和d的实际奇偶校验。它只需要猜测。

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

这只是我的猜测。如果有人真正看到过这些功能函数中的代码(或规范,那就是那么好)并且可以提供洞察力,那就太棒了。

2 个答案:

答案 0 :(得分:1)

首先看:Power by squaring for negative exponents

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

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

然后你;受限于log2定义范围,因此NaN|x|^y。如果你想要更好的东西,你可以尝试将y传播到这种形式:

y = a/b

其中a,b是整数。如果可能(或应用舍入),则将问题更改为:

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

现在你可以处理更多案件(完全按照你的建议):

  1. 如果a是偶数,则子结果不再是负数

    x^a>=0所以(x^a)^(1/b)>=0

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

  3. 其他结果为NaN或使用|x|^y

  4. 现在回到您的float问题,该号码始终采用以下格式:

    y = mantissa*exp2(exponent)
    

    所以是b是偶数(除非exponent!=0,这意味着数字是整数)。由于mantissa存储为整数,您可以通过检查其 LSB 来获得其奇偶校验。不要忘记在floats MSB 缺失且始终应为1,除非出现非规范化或Nan/Inf数字等特殊情况

答案 1 :(得分:0)

如果你准备作弊,这就是你如何能够对任何力量产生负面影响:

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

x^2b是正面的,所以拿第2根

没问题