【发布时间】:2017-04-11 00:24:21
【问题描述】:
我们的教授说如果apow() 无法计算ab,因为pow() 使用自然对数来计算它(ab= eb ln a) 并且由于它对于负数未定义,因此无法计算。我试过了,只要 b 是整数,它就可以工作。
我搜索了math.h 和其他文件,但无法找到该函数的定义方式以及它用于计算的内容。我也尝试搜索互联网,但没有任何成功。在 Stack Overflow 上也有类似的问题 here 和 here(对于 C#)。 (最后一个不错,就是找不到源代码。)
所以问题是pow() 在 C 中实际上是如何计算的?为什么当基数是有限且负数而指数是有限且非整数时,它会返回域错误?
【问题讨论】:
-
pow的计算精度是一个较长的故事,但是当底数为负数且指数为非整数时无法计算它的原因是结果将是一个复数不能由pow返回的double表示。不过,有cpow来处理这个问题。 -
取决于您的实现,即您使用的编译器和 C 库。
-
C99 7.12.7.4 (2) 状态:“pow 函数计算 x 的 y 次幂。如果 x 是有限的负数并且 y 是有限的而不是整数值,则会发生域错误,”所以我认为这不取决于实施。
a可以是负数,只要b是无限的或整数。 -
" 已搜索 math.h 和其他文件,但无法找到函数的定义方式" - 标头没有定义(
inline函数是特殊情况)。但我强烈怀疑你找不到实现!至少有一个 FOSS C 库可用。像“c pow implementation”这样的谷歌搜索词真的那不常见吗?? -
如果没有优化编译,结果将是您操作系统的实际 C 库中的内容。使用
-O3这样的标志,结果可能是优化的 SSE/AVX 实现,可以通过反汇编二进制来研究。