- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望编写自己的幂函数来处理非整数的 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
我从这个问题中得到了链接,其中有一堆相关的讨论
此页面描述了一种算法: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/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我发现了 pow(x, n) 的迭代实现,它需要 o(log n) 时间和常量空间,如下所示: double pow(double x, int n) { double left = x;
我想创建一个特征,说它实现了num_traits::pow::Pow - Rust。 我的特征当前定义为: pub trait PrimeSieveTrait: AddAssign + MulAs
对于我的项目,我应该在 java 中创建一个图形计算器(绘制图形),并以函数作为输入。我已经找到了一种正确绘制函数图的方法。但是我想不出一种方法可以让解释器理解该功能。如果我能够做到这一点,以便我可以
我发现对于大整数,math.pow() 没有成功给出它的整数版本。 (我在使用 math.pow 实现时遇到了一个错误 Karatsuba multiplication)。 例如: >>> a_Siz
问题或多或少说明了一切。 calling a host function("std::pow ") from a __device__/__global__ function("_calc_psd")
我想知道,因为当我在检查模式下运行我的代码时,似乎出现了一些差异。例如: List getFactors(int n) { List factors = [[1, n]]; doubl
pow(a/b,x) 和 pow(b/a,-x) 在精度上有区别吗?如果存在,将小于 1 的数字提升为正幂或将大于 1 的数字提升为负幂会产生更准确的结果吗? 编辑:让我们假设 x86_64 处理器和
此代码在 Windows 上的 Visual Studio 2010 上正确编译,但我在 Linux、g++ 上遇到此错误。谁能解释一下如何解决这个问题? int bits; T scale; std
Python内置的pow(x, y)(没有第三个参数)返回的结果和math.pow()返回的值有区别吗>,在两个 float 参数的情况下。 我问这个问题是因为 documentation对于 mat
这个问题在这里已经有了答案: Why was std::pow(double, int) removed from C++11? (1 个回答) 关闭 9 年前。 在 C++ 03 中,使用例如st
我可以将pow()与#include 一起使用,而无需使用using关键字或::运算符。为什么? 最佳答案 来自标准的[headers]/4。 Except as noted in Clause 20
我觉得这很有趣: System.out.println( (long)(Math.pow(2,63) - 1) == Long.MAX_VALUE); // true System.out.prin
这个打印 100: int j=2; int i= pow(10,2); printf("%d\n", i); 这个打印出 99: int j=2; int i= pow(10,j); print
这也是一个与数学相关的问题,但我想用 C++ 实现它...所以,我有一个 2^n 形式的数字,我必须计算它的数字总和(以 10 为基数;P)。我的想法是用下面的公式来计算: sum = (2^n mo
我看到这个关于 std::pow 的老问题:What is more efficient? Using pow to square or just multiply it with itself? 旧
我正在尝试比较 pow(x,2.0) 和 pow(x,2.0000001) 的性能,但我认为 2.0 会快得多,但它们的速度相同。我什至通过使用 -Xint 参数运行 jar 来删除 JIT 优化。
我的 linux 版本是 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u1 (2019-09-20) x86_64 GNU/Linux我的 gcc 版本是
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
python3 中的 pow() 函数提供指数的值。 >>>pow(2,3) 8 Python3 支持负指数,即 可以使用 pow(10,-1) 表示。当我计算 pow(4,-1,5) 时,它给出了输
我是一名优秀的程序员,十分优秀!