gpt4 book ai didi

math.h - erf(x) 和 math.h

转载 作者:行者123 更新时间:2023-12-04 16:37:58 26 4
gpt4 key购买 nike

根据 this site误差函数 erf(x) 来自 math.h。但实际上在 math.h 中,它不存在,并且 gcc 无法编译以下测试程序,而 g++ 可以:

#include <math.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
double x;
double erfX;
x = 1.0;
erfX = erf(x);

printf("erf(%f) = %f", x, erfX);
}

$ gcc mathHTest.c
/tmp/ccWfNox5.o: In function `main':
mathHTest.c:(.text+0x28): undefined reference to `erf'
collect2: ld returned 1 exit status
$ g++ mathHTest.c

g++ 引入了 gcc 没有的什么?在/usr/include 中,我唯一能找到 erf(x) 的地方是在 tgmath.h 中,我没有包含它。所以 g++ 必须抓取与 gcc 不同的头文件,但是哪些呢?

编辑:我没有在 libm 中与 gcc 链接,因此链接错误。但是,我仍然不明白为什么 erf() 不在 math.h 中。它来自哪里?

最佳答案

我有一个类似的问题,需要找到 erf 的确切定义所以让我扩展一下。正如 Chris Dodd 所说,函数在 bits/mathcalls.h 中声明包含在 maths.h 中.
bits/mathcalls.h :

...
#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Error and gamma functions. */
__MATHCALL (erf,, (_Mdouble_));
__MATHCALL (erfc,, (_Mdouble_));
__MATHCALL (lgamma,, (_Mdouble_));
__END_NAMESPACE_C99
#endif
...

宏魔法扩展 __MATHCALL (erf,, (_Mdouble_));
extern double erf (double) throw (); extern double __erf (double) throw ();

实际代码在 libm.alibm.so ( gcc -lm ):
$ nm /usr/lib/libm.a
...
s_erf.o:
00000400 T __erf
00000000 T __erfc
U __ieee754_exp
00000400 W erf
00000000 W erfc
...

来源可从 gnu libc获得网页。对于实际实现的粗略想法,这里有几行源代码:
sysdeps/ieee754/dbl-64/s_erf.c :
/* double erf(double x)
* double erfc(double x)
* x
* 2 |\
* erf(x) = --------- | exp(-t*t)dt
* sqrt(pi) \|
* 0
*
* erfc(x) = 1-erf(x)
* Note that
* erf(-x) = -erf(x)
* erfc(-x) = 2 - erfc(x)
*
* Method:
* 1. For |x| in [0, 0.84375]
* erf(x) = x + x*R(x^2)
* erfc(x) = 1 - erf(x) if x in [-.84375,0.25]
* = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375]
* where R = P/Q where P is an odd poly of degree 8 and
* Q is an odd poly of degree 10.
* -57.90
* | R - (erf(x)-x)/x | <= 2
*
*
* Remark. The formula is derived by noting
* erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
* and that
* 2/sqrt(pi) = 1.128379167095512573896158903121545171688
* is close to one. The interval is chosen because the fix
* point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
* near 0.6174), and by some experiment, 0.84375 is chosen to
* guarantee the error is less than one ulp for erf.
*
* 2. For |x| in [0.84375,1.25], let s = |x| - 1, and
...

关于math.h - erf(x) 和 math.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/631629/

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