【发布时间】:2022-11-30 09:34:52
【问题描述】:
在 C 语言中,我想知道是否存在计算半整数幂的“最佳”方法。简而言之,问题是计算 x^(n/2)(假设 n 是奇数且小得体,x 是一些浮点数)。 sqrt(pow(x, n)) 和pow(x, 0.5 * n) 之间的性能/准确性是否存在重大差异?甚至逆转:pow(sqrt(x), n)。
是否有其他一些实现来处理这种特定的半整数情况?
我的第一个想法是您只需使用 pow 并在一次调用中计算整个事情,但我觉得浮点舍入和事情我失去了一些问题的精确度,这是因为这是明确的半整数。我想如果你使用 pow 提升到整数幂并让 sqrt 处理 (1/2) 部分,那么可能会有更好的错误性能。
我还注意到 GSL 具有计算小整数幂的函数;将这些功能与sqrt 结合使用会比仅使用pow 更好吗?
我对使用 C 进行科学编程还很陌生,所以我不确定我什至会去哪里寻找这样的实现,而谷歌并没有真正找到任何东西。
【问题讨论】:
-
通常更直接的方法更好:在这种情况下为
pow()。请记住,当像这样进行数学运算时,sqrt()最终只是pow()的特例。请注意,由于欢乐浮点数学,你需要支付非常仔细的注意你如何四舍五入你的结果。如果您得到像 24.999999993851 这样的值,您可能希望将其解释为 25。 -
对于整数,如果可以避免的话,我根本不推荐浮点函数。不幸的是,
sqrt有点难以避免,因为它不是那么容易计算(但我敢打赌,找到好的整数算法也相对容易)。 -
对各种方法的性能和精度运行一些基准测试似乎并不复杂。
-
在你进入这个兔子洞之前,你有没有可测量的性能问题那必须得到解决?如果你不这样做,只需使用
pow(),继续生活。如果你是有性能问题,那么你需要更深入地挖掘。pow()可能不是核心问题。 -
@tadman哈哈,这是一个好点;我绝对只是对一些可能根本不是问题的事情进行了书呆子式的抨击。我没有遇到任何具体问题;我刚刚到了我正在实施这个的地步并认为“一定以前有人想过这个……”
标签: c math floating-point gsl