gpt4 book ai didi

ios - pow 函数如何工作?

转载 作者:行者123 更新时间:2023-11-29 02:53:39 25 4
gpt4 key购买 nike

我希望编写自己的幂函数来处理非整数的 NSDecimalNumbers 和指数。我首先尝试使用牛顿法和内置整数幂法的组合,但由于牛顿法,当我的指数超过 2 位小数时,我会收到溢出错误。所以我想也许浮点值 pow 函数可以作为我自己的函数的一个很好的模型。所以我想知道是否有人知道我在哪里可以找到有关 pow 函数内部工作原理的某种文档?

编辑:

@wombat57,这些链接看起来像是我正在寻找的东西,但我不知道要阅读它们。您建议的算法实际上是我正在使用的算法。由于指数非常大,溢出来自牛顿法。因为我得到的是十进制形式的指数,所以我必须先将其转换为分数。据我所知,在代码中解决这个问题的唯一方法是将小数乘以十,直到得到一个整数,然后将其用作分子。这样做,对于具有 3 位或更多小数的数字,您将获得 100+ 的指数。这会导致溢出错误。

最佳答案

编辑 1:这里是实际来源的链接

http://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/expf_logf_powf.c http://opensource.apple.com/source/Libm/Libm-315/Source/ARM/powf.c

我从这个问题中得到了链接,其中有一堆相关的讨论

self made pow() c++

此页面描述了一种算法:Link .x^(1/n) = x 的第 n 个根,并且 x^mn = (x^m)^n。因此,x^(m/n) = (x 的第 n 个根)^m。可以用牛顿法计算任意根。整数幂可以通过平方求幂来计算。对于无理指数,您可以使用越来越准确的有理近似值,直到获得所需的有效数字位数。

编辑 2:

牛顿法涉及将您当前的猜测提高到您要寻找的根的幂。如果那个幂很大,并且猜测甚至有点太高,这可能会导致溢出。这里的一种解决方案是识别这种情况。如果发生溢出,这意味着猜测太高了。您可以通过(每当猜测导致溢出)将当前猜测设置为上次未溢出的猜测和当前猜测之间的值来解决问题(您可能需要多次执行此操作)。也就是说,每当牛顿法溢出时,对最后一个没有溢出的猜测进行二分查找。这是实现所有这些的一些 python:

def nroot(n, b, sig_figs = 10):
g1 = 1.0
g2 = 1.0
while True:
done = False
while not done:
try:
g3 = g2 - ((g2**b) - n) / (b * (g2**(b-1)))
done = True
except OverflowError:
g2 = (g1 + g2) / 2.0

if abs(g2 - g3) < 1.0 / (10**sig_figs):
return g3
g1 = g2
g2 = g3

def npowbysqr(n, p):
if p == 0:
return 1.0
if p % 2 == 0:
v = npowbysqr(n, p/2)
return v*v
else:
return n*npowbysqr(n, p-1)

def npow(n, p):
return npowbysqr(nroot(n, 1000000), int(p*1000000))

print npow(5, 4.3467)
print 5**4.3467

我应该补充一点,可能有更好的解决方案。然而,这似乎确实有效

关于ios - pow 函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com