erf(x) 和 math.h

2023-11-29

根据这个网站误差函数 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_)); to

extern double erf (double) throw (); extern double __erf (double) throw ();

实际代码在libm.a or libm.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     
 ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

erf(x) 和 math.h 的相关文章

随机推荐

  • initMap 不是一个函数

    我不明白有什么问题 我使用了 Google Map API 中的这个示例 简单地图 section section main js
  • Java程序执行一个命令需要很长时间

    我阅读了很多示例 最终使用以下代码从 Java 程序内部执行命令行命令 public static void executeCommand final String command throws IOException Interrupte
  • Javadoc 中文本文件(资源)的链接

    我进行了搜索 但找不到正确的答案 如何在 Javadoc 中使用指向资源文本文件的链接 link easywords txt 不起作用 a href Easy words a 也不行 Try a href Easy words a 反而 链
  • 使用 C# 为通过 Gmail 发送的邮件设置不同的“发件人”地址

    我正在使用一个简单的邮件发送器类 该类使用System Net Mail 我需要更新我的应用程序 以便各个用户可以通过它发送电子邮件 使用相同的 smtp 帐户 但 发件人 地址应该是导致发送电子邮件的用户的地址 我尝试设置From的财产M
  • Hashmap、Treemap 和 LinkedHashmap 在 Java 中如何工作?

    我对地图有各种疑问 迭代 Hashmap 时 无法保证迭代顺序 这是为什么呢 为什么 Hashmap 比 Treemap 更快 LinkedHashMap 是如何工作的 它们如何维护顺序 是因为它们有一个双向链表 其中包含有关哪个条目存储在
  • 为什么Java不初始化数组对象?

    如果在java中运行以下代码 public class Testing public static void main String args TestObject array new TestObject 4 array 0 new Te
  • 绑定到 Window.Resources 中 DataTemplate 中拥有窗口视图模型中的属性

    我的窗口资源部分中有一个 DataTemplate 它创建一个带有 ContextMenu 的 TextBlock 我希望能够设置 ContextMenu 中的 MenuItem 在我的窗口视图模型中是否可见 我尝试通过设置访问窗口的 Da
  • 有没有办法在本地更新 maven 的 default-bindings.xml

    这听起来可能很愚蠢 但是有没有办法编辑或更新maven的默认绑定文件呢 META INF plexus default bindings xml 我为什么要这么做 背景 我正在使用最新的maven version 3 3 9在我的机器上作为
  • 如何在pygame中的精灵上放置健康栏

    根据标题 我希望我的玩家头上有一个生命条 如果他们移动 生命条也会移动 说精灵是我的玩家 嘿精灵 他的头顶上有一个健康栏 是的 就是这样 老实说 我真的不知道从哪里开始 所以我们将不胜感激 谢谢 附 非常感谢Rabbid76的帮助 还有安禅
  • 是否可以并行读取网络摄像头帧?

    我有一个简单的Python使用捕获网络摄像头的脚本OpenCV 我的网络摄像头有潜力传输 30 FPS 但自从我树莓派不够强大 我只能读取 20 FPS 运行脚本时 我的 CPU 的一个核心最大使用到 100 但其余核心未受影响 因此我尝试
  • 只显示文章内容

    如何只显示一篇文章中的内容 我使用 Joomla 2 5 和 Ajax 来调用一篇文章 但是当我在 div 标签 我再次渲染页眉 页脚和所有页面 但我只想要内容 如何配置页面或文章以仅显示内容 如果您只想获取组件 可以附加tmpl comp
  • 在 postgresql 中存储 24:00:00 以上时间的最佳方法?

    我将 GTFS 源存储到 SQL 数据库中 并且某些时间预计存储在 24 00 00 时间上限之上 例如 某些列车在上午 12 30 运行 但列出了前几天的服务 并且该运行时间在 GTFS 规范中存储为 24 30 解决这个问题的最佳方法是
  • 哈希图空间和性能问题

    我必须在 HashMultiMap 中存储超过 1 亿个键值 键可以有多个值 谁能帮助我哪一个存储和搜索速度更快 1 伯克利数据库 2 东京内阁 3 H2 4 EhCache 5 或其他 另一点 那些性能与内存中的哈希图大致相同吗 一点点指
  • 如何将动态html转换为pdf?

    我想将动态 html 转换为 pdf 以下代码显示静态 html 到 pdf 的转换 Document document new Document step 2 PdfWriter writer PdfWriter getInstance
  • super() 在 Sublime Text 中抛出错误,适用于 PyCharm/Terminal

    我生成了以下代码作为作业的一部分 class Question Base class for all questions question count 0 def init self desc self desc desc Question
  • SqlDateTime.MinValue != DateTime.MinValue,为什么?

    我想知道 为什么 SqlDateTime MinValue 与 DateTime MinValue 不一样 我认为 SQL 和 NET 之间的区别Date数据类型源自 SQL Server 的事实datetime数据类型 最小值和最大值以及
  • 开启个人热点?

    有没有办法可以使用 Objective C 打开个人热点 我需要连接到打印机 并且不希望用户转到设置然后将其打开 而是想在代码中打开它 打印 然后将其关闭 抱歉 在已发布的 API 中无法执行此操作 您可能需要在以下地址提交增强请求 htt
  • 什么会导致我的源文件变灰,文件图标上有删除线?

    我正在尝试使用 Eclipse Mars 为 STM32F4 Discovery 板构建应用程序 我特别想使用 SPI 库 我已在主程序中包含相应的头文件 但收到错误消息 指出我尝试使用的函数未定义 稍微戳了一下 我意识到该项目的大部分源文
  • 有没有办法预先泄漏和取消泄漏值?

    我目前正在研究用数组做更多的事情 但我认为如果我们被允许以某种方式转变为一个 这些操作的性能可能会更好Leaked
  • erf(x) 和 math.h

    根据这个网站误差函数 erf x 来自 math h 但实际查看 math h 时 它不存在 并且 gcc 无法编译以下测试程序 而 g 可以 include