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是偶数。毕竟,浮点数可以是任何东西,数学库不希望通过假设它可能不合理而给出可能错误的结果。
这只是我的猜测。如果有人真正看到过这些功能函数中的代码(或规范,那就是那么好)并且可以提供洞察力,那就太棒了。
答案 0 :(得分:1)
首先看:Power by squaring for negative exponents
现在让我们假设x^y
和x<0
不是整数的情况y
。如果你使用
x^y = exp2(y*log2(x))
然后你;受限于log2
定义范围,因此NaN
或|x|^y
。如果你想要更好的东西,你可以尝试将y
传播到这种形式:
y = a/b
其中a,b
是整数。如果可能(或应用舍入),则将问题更改为:
x^y = (x^a)^(1/b)
现在你可以处理更多案件(完全按照你的建议):
如果a
是偶数,则子结果不再是负数
为x^a>=0
所以(x^a)^(1/b)>=0
如果两个a,b
都是奇数,则结果为负
其他结果为NaN
或使用|x|^y
现在回到您的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根