【问题标题】:Which functions are affected by -fno-math-errno?哪些函数受 -fno-math-errno 影响?
【发布时间】:2019-12-31 18:05:42
【问题描述】:

这篇文章让我很兴奋:https://stackoverflow.com/a/57674631/2492801,我考虑使用-fno-math-errno。但我想确保我不会损害我正在开发的软件的行为。

因此,我检查了(相当大的)代码库以查看errno 的使用位置,并且我想确定这些用法是否会干扰-fno-math-errno。但是怎么做呢?文档说:

-fno-math-errno

在调用使用单条指令执行的数学函数后不要设置 errno,例如 sqrt...

但是我怎么知道哪些数学函数是用一条指令执行的呢?这是在某处记录的吗?在哪里?

似乎我使用的代码库依赖于errno,尤其是在调用strtol 和处理流时。我猜strtol 不是用一条指令执行的。它是否被认为是一个数学函数?我怎么能确定?

【问题讨论】:

  • 您对此类内容的第一个 goto 应该是 cppreference
  • @NathanOliver 我已经检查过了。我找不到任何提示 strtol 是用一条指令执行还是被认为是一个数学函数。我也找不到使用单条指令执行的数学函数列表。你能给我更多的提示吗?
  • 我们一般无法知道实现,所以您实际上必须检查您的实现。您可以做的是使用它来获取设置errorno 的函数列表。此外,strtol 使用整数数学,而不是浮点数学,因此可以免除。
  • 您评论的第二部分似乎是正确的。我帖子中 gcc 文档的引文在下面一行说明:“以下选项控制关于浮点运算的编译器行为。”因此strtol 是安全的。但是前两句我看不懂。对于我检查过的来自<cmath> 的所有函数,cppreference 声明:“错误按照 math_errhandling 中的指定报告。”但我仍然不知道它们是否是用一条指令执行的。那么你的建议是什么?阅读实现源代码?
  • @BenjaminBihler -- 这是不符合标准的行为,因此标准要求的文档(例如 cppreference)对您没有帮助。你被编译器给你的任何文档困住了。

标签: c++ gcc compiler-optimization errno math-functions


【解决方案1】:

您可以在 GCC 的 builtins.def 中找到受 -fno-math-errno 影响的函数列表(搜索“ERRNO”)。似乎只有math.h 标头(cossinexp 等)中的一些函数受到影响。其他使用 errno(strtol 等)的标准函数的处理在此标志下不会改变。

【讨论】:

  • 这里的提问者似乎不知道“数学函数”的标准含义,并询问strtol是否是一个数学函数。您只是通过示例回答该部分,因此最好更清楚地说明数学函数是在math.h 中声明的函数,它采用floatdoublelong double 参数。即他们只进行浮点计算,仅此而已。像 nextafternearbyintlrint 这样的东西也是数学函数,而不仅仅是像 cosexp 这样的东西,它们是连续数学函数的 FP 实现。
  • @PeterCordes 谢谢,我已经更新了答案。如果您认为更多细节可能会有所帮助 - 请随时更新答案。
猜你喜欢
  • 1970-01-01
  • 2019-08-14
  • 2023-03-31
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多