erfcf(FLT_MAX)
产生 0.0f
并将 errno
设置为 ERANGE
。
erff(FLT_MAX)
产生 1.0f
并且不会将 errno
设置为 ERANGE
。
在这两种情况下,返回的结果都不同于“真实结果”(即以无限精度获得)。
为什么只为
ERANGE
设置erfcf
?
C11措辞(强调已添加):
同样,如果由于极值,函数的数学结果无法在指定类型的对象中表示,则会出现 范围错误。
C2X措辞(强调已添加):
同样,当且仅当结果上溢或下溢时,才会发生 范围错误 ,如下所定义。每个函数的描述列出了任何所需的范围误差;实现可以定义额外的范围误差,前提是这些误差与函数的数学定义一致并且是上溢或下溢的结果。需要或实现定义的范围错误应该或可以报告,分别如本子条款中所指定。
作为一般规则,数学函数设置
errno
被认为是过时的功能,因为 IEEE 无穷大、NaN 和浮点异常标志被认为是报告数学计算错误的高级方法。 标准中似乎没有明确说明这一点,但一般请参见 7.12.1 [数学函数中的错误条件处理],特别是 math_errhandling
的讨论。
erfc(x)
变为 0,erf(x)
变为 1; erfc(10)
已经在 2e-45
的顺序上。 在 IEEE 754 的术语中,描述 erfcf(FLT_MAX)
和 erff(FLT_MAX)
结果的最精确方式分别是 inexact 零或一。 然而,即使在符合附件 F 的实现中,库函数也不需要报告不精确性 (F.10p8)。
过于接近零而无法准确表示的数学结果是“下溢”条件 (7.12.1p6)。 下溢条件可以(但不要求)将 errno 设置为 ERANGE。
以至于无法准确表示的数学结果不被视为 7.12.1 中描述的任何错误条件,因此not 通过设置 errno 来报告。