为什么erf函数没有范围误差?

问题描述 投票:0回答:1

erfcf(FLT_MAX)
产生
0.0f
并将
errno
设置为
ERANGE

erff(FLT_MAX)
产生
1.0f
并且不会将
errno
设置为
ERANGE

在这两种情况下,返回的结果都不同于“真实结果”(即以无限精度获得)。

为什么只为

ERANGE
设置
erfcf


C11措辞(强调已添加):

同样,如果由于极值,函数的数学结果无法在指定类型的对象中表示,则会出现 范围错误。

C2X措辞(强调已添加):

同样,当且仅当结果上溢或下溢时,才会发生 范围错误 ,如下所定义。每个函数的描述列出了任何所需的范围误差;实现可以定义额外的范围误差,前提是这些误差与函数的数学定义一致并且是上溢或下溢的结果。需要或实现定义的范围错误应该或可以报告,分别如本子条款中所指定。

c math range errno math.h
1个回答
1
投票
  1. 作为一般规则,数学函数设置

    errno
    被认为是过时的功能,因为 IEEE 无穷大、NaN 和浮点异常标志被认为是报告数学计算错误的高级方法。 标准中似乎没有明确说明这一点,但一般请参见 7.12.1 [数学函数中的错误条件处理],特别是
    math_errhandling
    的讨论。

  2. 随着 x 的增加,
  3. erfc(x)
    变为 0,
    erf(x)
    变为 1;
    erfc(10)
    已经在
    2e-45
    的顺序上。 在 IEEE 754 的术语中,描述
    erfcf(FLT_MAX)
    erff(FLT_MAX)
    结果的最精确方式分别是 inexact 零或一。 然而,即使在符合附件 F 的实现中,库函数也不需要报告不精确性 (F.10p8)。

  4. 过于接近零而无法准确表示的数学结果是“下溢”条件 (7.12.1p6)。 下溢条件可以(但不要求)将 errno 设置为 ERANGE。

  5. 过于接近
  6. one

    以至于无法准确表示的数学结果不被视为 7.12.1 中描述的任何错误条件,因此not 通过设置 errno 来报告。

© www.soinside.com 2019 - 2024. All rights reserved.