繁体   English   中英

C 浮点异常处理

[英]C floating point exception handling

fenv.h的手册页( feraiseexcept及其同类)非常缺乏信息。 我在网上找到的示例(cppreference.com 等)非常少。

它们应该如何使用? 特别是, feraiseexcept(...)总是返回吗? 应该从获得非法参数的 function 返回什么,例如sqrt(-1) 我假设NAN

是否应该在 function 中获取并恢复原始 state? 例如,一个人可能会为某个迭代算法计算一个起点,如果该计算结果不准确并没有任何后果,那么迭代可以收敛到全精度。

在调用例如库函数的程序中应该如何使用它?

(我宁愿不必深入研究随机数学库资源来回答上述问题。)

fenv.hferaisexceptionand [its] ilk )的手册页非常缺乏信息,我在网上找到的示例(cppreference.com 等)非常少。

<fenv.h>C 标准指定。 Unix 手册页仅在扩展 C 规范时才有用。 对 cppreference.com 持怀疑态度; 已知有错误。

它们应该如何使用?

讨论所有<fenv.h>对于 Stack Overflow 来说是一个过于宽泛的问题。

特别是, feraisexception(...)总是返回吗?

根据 C 2018 7.6.2.3 2 和 foonote 221, feraiseexcept尝试导致浮点异常,就好像它们是由算术指令生成的一样。 因此,如果它引发一个启用了陷阱的异常,它将导致一个陷阱。

相反, fesetexceptflag仅设置浮点异常标志,而不会生成实际异常。 根据 7.6.2.4 2,“……此 function 不会引发浮点异常,而只会设置标志的 state。”

应该从获得非法参数的 function 返回什么,例如sqrt(-1) 我假设NAN

这在<fenv.h>的域之外。 sqrt在 7.12 中指定,涵盖<math.h> 根据 7.12.7.5 2,如果参数小于零,则会发生sqrt域错误。 根据 7.12.1, 2,“……在域错误中,function 返回实现定义的值……”并且它还可能设置errno和/或引发“无效”浮点异常。 通常,实现将返回安静的 NaN。

是否应该在 function 中获取并恢复原始 state?

这取决于指定或实施 function 的人。 提供“基本”数学函数的例程,对于标准数学库,可能需要影响浮点 state,仅在提供的理想 function 所要求的情况下,隐藏任何内部操作。 例如,如果log10(100)是通过使用工程多项式来逼近对数来实现的,那么多项式的评估可能会使用具有非常高的精度和准确度的算术运算,以至于最终结果在四舍五入到最终格式时, 正好是两个。 但是中间计算可能涉及一些不精确的操作。 因此,将引发不精确的异常。 如果例程仅计算多项式并返回准确的结果 2,它将引发不准确标志。 理想情况下,例程将抑制浮点陷阱、保存异常标志、进行计算、恢复最初启用的陷阱、设置适当的异常标志(如果有)并返回结果。 (或者,可以实现例程以仅使用 integer 算法,避免浮点问题。)

在专门的库例程之外,浮点子例程很少 go 到这种程度。 取决于每个应用程序希望其例程如何运行。

例如,一个人可能会为某个迭代算法计算一个起点,如果该计算结果不准确是不连续的,因为迭代可能会收敛到全精度。

这一段不清楚,可能不合语法。 我无法按书面方式回答。

在调用例如库函数的程序中应该如何使用它?

这个问题不清楚,可能是因为前一段不够清晰。 “这”的来历不明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM