命名空间
变体
操作

nextafter、nextafterf、nextafterl、nexttoward、nexttowardf、nexttowardl

来自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
类型
(C99)(C99)    

(C99)(C99)    

函数
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C23)    
指数函数
(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)
(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)(C23)
参数和返回值
(C99)(C99)(C99)(C99)(C99)    
错误处理
(C99)    

 
定义在头文件 <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) 首先,将两个参数都转换为函数的类型,然后返回fromto方向上的下一个可表示值。如果from等于to,则返回to
4-6) 首先,将第一个参数转换为函数的类型,然后返回fromto方向上的下一个可表示值。如果from等于to,则返回to,从long double转换为函数的返回类型,不会丢失范围或精度。
7) 类型通用宏:如果任何参数的类型为long double,则调用nextafterl。否则,如果任何参数的类型为整数类型或double,则调用nextafter。否则,调用nextafterf
8) 类型通用宏:如果参数from的类型为long double,则调用nexttowardl。否则,如果from的类型为整数类型或double,则调用nexttoward。否则,调用nexttowardf

内容

[编辑] 参数

from, to - 浮点值

[编辑] 返回值

如果未发生错误,则返回在 to 方向上 from 的下一个可表示值。如果 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 nextafter 函数 (p: 待定)
  • 7.12.11.4 nexttoward 函数 (p: 待定)
  • 7.25 类型泛型数学 <tgmath.h> (p: 待定)
  • F.10.8.3 nextafter 函数 (p: 待定)
  • F.10.8.4 nexttoward 函数 (p: 待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12.11.3 nextafter 函数 (p: 187)
  • 7.12.11.4 nexttoward 函数 (p: 187)
  • 7.25 类型泛型数学 <tgmath.h> (p: 272-273)
  • F.10.8.3 nextafter 函数 (p: 386)
  • F.10.8.4 nexttoward 函数 (p: 386)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12.11.3 nextafter 函数 (p: 256)
  • 7.12.11.4 nexttoward 函数 (p: 257)
  • 7.25 类型泛型数学 <tgmath.h> (p: 373-375)
  • F.10.8.3 nextafter 函数 (p: 529)
  • F.10.8.4 nexttoward 函数 (p: 529)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12.11.3 nextafter 函数 (p: 237)
  • 7.12.11.4 nexttoward 函数 (p: 238)
  • 7.22 类型泛型数学 <tgmath.h> (p: 335-337)
  • F.9.8.3 nextafter 函数 (p: 466)
  • F.9.8.4 nexttoward 函数 (p: 466)

[编辑] 另请参见

C++ 文档 for nextafter