命名空间
变体
操作

nextafter, nextafterf, nextafterl, nexttoward, nexttowardf, nexttowardl

来自 cppreference.cn
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C99)
指数函数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
幂函数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角函数和双曲函数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最接近整数的浮点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点数操作
(C99)(C99)
(C99)(C23)
(C99)
nextafternexttoward
(C99)(C99)
(C23)(C23)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数
十进制重编码函数
总阶数和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
误差和伽玛函数
(C99)
(C99)
(C99)
(C99)
类型
宏常量
特殊浮点数值
(C99)(C23)
参数和返回值
错误处理
快速运算指示符
 
定义于头文件 <math.h>
float       nextafterf( float from, float to );
(1) (C99 起)
double      nextafter( double from, double to );
(2) (C99 起)
long double nextafterl( long double from, long double to );
(3) (C99 起)
float       nexttowardf( float from, long double to );
(4) (C99 起)
double      nexttoward( double from, long double to );
(5) (C99 起)
long double nexttowardl( long double from, long double to );
(6) (C99 起)
定义于头文件 <tgmath.h>
#define nextafter(from, to)
(7) (C99 起)
#define nexttoward(from, to)
(8) (C99 起)
1-3) 首先,将两个参数都转换为函数的类型,然后返回从 from 沿着 to 方向的下一个可表示值。如果 from 等于 to,则返回 to
4-6) 首先,将第一个参数转换为函数的类型,然后返回从 from 沿着 to 方向的下一个可表示值。如果 from 等于 to,则返回 to,从 long double 转换为函数的返回类型,而不会损失范围或精度。
7) 类型泛型宏:如果任何参数的类型为 long double,则调用 nextafterl。否则,如果任何参数具有整数类型或类型为 double,则调用 nextafter。否则,调用 nextafterf
8) 类型泛型宏:如果参数 from 的类型为 long double,则调用 nexttowardl。否则,如果 from 具有整数类型或类型 double,则调用 nexttoward。否则,调用 nexttowardf

内容

[编辑] 参数

from, to - 浮点数值

[编辑] 返回值

如果没有错误发生,则返回从 from 沿着 to 方向的下一个可表示值。如果 from 等于 to,则返回 to,并转换为函数的类型。

如果由于上溢发生范围错误,则返回 ±HUGE_VAL±HUGE_VALF±HUGE_VALL(符号与 from 相同)。

如果由于下溢发生范围错误,则返回正确的结果。

[编辑] 错误处理

错误的报告方式如 math_errhandling 中所指定。

如果实现支持 IEEE 浮点算术 (IEC 60559),

  • 如果 from 是有限的,但预期结果是无穷大,则引发 FE_INEXACTFE_OVERFLOW
  • 如果 from 不等于 to 且结果是次正规数或零,则引发 FE_INEXACTFE_UNDERFLOW
  • 在任何情况下,返回值都独立于当前的舍入模式
  • 如果 fromto 中任一为 NaN,则返回 NaN。

[编辑] 注释

POSIX 规定,上溢和下溢条件是范围错误(可能设置 errno)。

IEC 60559 建议当 from == to 时返回 from。这些函数改为返回 to,这使得零附近的行为保持一致:nextafter(-0.0, +0.0) 返回 +0.0,而 nextafter(+0.0, -0.0) 返回 -0.0

nextafter 通常通过操作 IEEE 表示来实现(glibc musl)。

[编辑] 示例

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
 
int main(void)
{
    float from1 = 0, to1 = nextafterf(from1, 1);
    printf("The next representable float after %.2f is %.20g (%a)\n", from1, to1, to1);
 
    float from2 = 1, to2 = nextafterf(from2, 2);
    printf("The next representable float after %.2f is %.20f (%a)\n", from2, to2, to2);
 
    double from3 = nextafter(0.1, 0), to3 = 0.1;
    printf("The number 0.1 lies between two valid doubles:\n"
           "    %.56f (%a)\nand %.55f  (%a)\n", from3, from3, to3, to3);
 
    // difference between nextafter and nexttoward:
    long double dir = nextafterl(from1, 1); // first subnormal long double
    float x = nextafterf(from1, dir); // first converts dir to float, giving 0
    printf("Using nextafter, next float after %.2f (%a) is %.20g (%a)\n",
           from1, from1, x, x);
    x = nexttowardf(from1, dir);
    printf("Using nexttoward, next float after %.2f (%a) is %.20g (%a)\n",
           from1, from1, x, x);
 
    // special values
    {
        #pragma STDC FENV_ACCESS ON
        feclearexcept(FE_ALL_EXCEPT);
        double from4 = DBL_MAX, to4 = nextafter(from4, INFINITY);
        printf("The next representable double after %.2g (%a) is %.23f (%a)\n",
               from4, from4, to4, to4);
        if(fetestexcept(FE_OVERFLOW)) puts("   raised FE_OVERFLOW");
        if(fetestexcept(FE_INEXACT)) puts("   raised FE_INEXACT");
    } // end FENV_ACCESS block
 
    float from5 = 0.0, to5 = nextafter(from5, -0.0);
    printf("nextafter(+0.0, -0.0) gives %.2g (%a)\n", to5, to5);
}

输出

The next representable float after 0.00 is 1.4012984643248170709e-45 (0x1p-149)
The next representable float after 1.00 is 1.00000011920928955078 (0x1.000002p+0)
The number 0.1 lies between two valid doubles:
    0.09999999999999999167332731531132594682276248931884765625 (0x1.9999999999999p-4)
and 0.1000000000000000055511151231257827021181583404541015625  (0x1.999999999999ap-4)
Using nextafter, next float after 0.00 (0x0p+0) is 0 (0x0p+0)
Using nexttoward, next float after 0.00 (0x0p+0) is 1.4012984643248170709e-45 (0x1p-149)
The next representable double after 1.8e+308 (0x1.fffffffffffffp+1023) is inf (inf)
   raised FE_OVERFLOW
   raised FE_INEXACT
nextafter(+0.0, -0.0) gives -0 (-0x0p+0)

[编辑] 参考文献

  • C23 标准 (ISO/IEC 9899:2024)
  • 7.12.11.3 The nextafter functions (页码: 待定)
  • 7.12.11.4 The nexttoward functions (页码: 待定)
  • 7.25 类型泛型数学 <tgmath.h> (页码: 待定)
  • F.10.8.3 The nextafter functions (页码: 待定)
  • F.10.8.4 The nexttoward functions (页码: 待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12.11.3 The nextafter functions (页码: 187)
  • 7.12.11.4 The nexttoward functions (页码: 187)
  • 7.25 类型泛型数学 <tgmath.h> (页码: 272-273)
  • F.10.8.3 The nextafter functions (页码: 386)
  • F.10.8.4 The nexttoward functions (页码: 386)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12.11.3 The nextafter functions (页码: 256)
  • 7.12.11.4 The nexttoward functions (页码: 257)
  • 7.25 类型泛型数学 <tgmath.h> (页码: 373-375)
  • F.10.8.3 The nextafter functions (页码: 529)
  • F.10.8.4 The nexttoward functions (页码: 529)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12.11.3 The nextafter functions (页码: 237)
  • 7.12.11.4 The nexttoward functions (页码: 238)
  • 7.22 类型泛型数学 <tgmath.h> (页码: 335-337)
  • F.9.8.3 The nextafter functions (页码: 466)
  • F.9.8.4 The nexttoward functions (页码: 466)

[编辑] 参见

C++ 文档 关于 nextafter