【问题标题】:Power function handling negative base with non integer exponents处理具有非整数指数的负底的幂函数
【发布时间】:2017-08-26 00:39:31
【问题描述】:

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

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

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

不过,这只是我的猜测。如果有人真正看到过这些幂函数(或规范,同样好)中的代码并且可以提供见解,那就太好了。

【问题讨论】:

  • 如果您给出“实际上能够给出真实结果”的语言和计算器的示例,将会有很大帮助。我唯一知道的是 TI Nspire CX 手持式图形计算器,而且我相信德州仪器 (Texas Instruments) 因保持其计算器源代码不开放而臭名昭著(尽管他们使用计算器打开了一些软件)。
  • 对于非整数指数,你会得到 复根;对于无理指数,你会得到无穷多个。您可以使用数学恒等式来解决 Math.pow 的限制 - 请参阅 欧拉恒等式De Moivre 定理
  • 能举出具体的例子吗?我觉得这个问题令人困惑。如前所述,所有数字二进制浮点数都是有理数(即分数),其中 d 为偶数(即 2 的幂)。如果“奇偶校验”指的是整数的奇数或偶数属性,我们因此知道 d 是偶数,而浮点数的位模式告诉我们 c 是奇数还是偶数。所以我不理解“由于信息丢失,无法知道 c 和 d 的真正奇偶性”的说法。
  • 如果将浮点数替换为它所精确表示的约简分数,它要么是整数,要么分母一定是偶数而分子一定是奇数(认为是约数)。因此,您绝不可能返回真正的结果...

标签: math floating-point rational-number


【解决方案1】:

先见:Power by squaring for negative exponents

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

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

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

y = mantissa*exp2(exponent)

所以是的b 是偶数(除非exponent!=0 表示数字是整数)。由于mantissa 存储为整数,因此您可以通过检查其LSB 来获得其奇偶性。不要忘记,在floats 中,MSB 是缺失的,并且始终应该是1,除非存在像反规范化或Nan/Inf 数字这样的特殊情况

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 您的代码没有找到实际 x 的正确幂,它找到了 x 的绝对值 的幂。那不是一回事。例如,您的代码声称(-1)^(1/3)1,但它应该给出-1(如OP 所愿)或1/2 + sqrt(3)/2*j(如Python 近似返回)。
    • 当然,这就是为什么它被命名为作弊;)启发这个愚蠢答案的是关于浮点数有效奇偶校验的论文:这是没有意义的,一旦分数减少,分子就会是奇数(除非浮点数表示是一个整数)。此外,提升到分数的定义在某种程度上是任意的。
    猜你喜欢
    • 1970-01-01
    • 2012-02-10
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    相关资源
    最近更新 更多