Namespaces
Variants

std:: nextafter, std:: nextafterf, std:: nextafterl, std:: nexttoward, std:: nexttowardf, std:: nexttowardl

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
nextafter nexttoward
(C++11) (C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
헤더 파일에 정의됨 <cmath>
(1)
float nextafter ( float from, float to ) ;

double nextafter ( double from, double to ) ;

long double nextafter ( long double from, long double to ) ;
(C++11 이후)
(C++23 이전)
constexpr /* floating-point-type */

nextafter ( /* floating-point-type */ from,

/* floating-point-type */ to ) ;
(C++23 이후)
float nextafterf ( float from, float to ) ;
(2) (C++11 이후)
(C++23 이후 constexpr)
long double nextafterl ( long double from, long double to ) ;
(3) (C++11 이후)
(C++23 이후 constexpr)
(4)
float nexttoward ( float from, long double to ) ;

double nexttoward ( double from, long double to ) ;

long double nexttoward ( long double from, long double to ) ;
(C++11부터)
(C++23까지)
constexpr /* floating-point-type */

nexttoward ( /* floating-point-type */ from,

long double to ) ;
(C++23부터)
float nexttowardf ( float from, long double to ) ;
(5) (C++11 이후)
(C++23 이후 constexpr)
long double nexttowardl ( long double from, long double to ) ;
(6) (C++11 이후)
(C++23 이후 constexpr)
헤더 파일에 정의됨 <cmath>
template < class Arithmetic1, class Arithmetic2 >

/* 공통 부동 소수점 타입 */

nextafter ( Arithmetic1 from, Arithmetic2 to ) ;
(A) (C++11 이후)
(C++23 이후 constexpr)
template < class Integer >
double nexttoward ( Integer from, long double to ) ;
(B) (C++11 이후)
(C++23 이후 constexpr)

from 의 다음 표현 가능한 값을 to 방향으로 반환합니다.

1-3) 만약 from to 와 같다면, to 가 반환됩니다. 라이브러리는 모든 cv-한정되지 않은 부동소수점 타입에 대해 매개변수 from to 의 타입으로 std::nextafter 의 오버로드를 제공합니다. (C++23부터)
4-6) 만약 from to 와 같다면, to 가 반환되며, 이는 long double 에서 함수의 반환 타입으로 범위나 정밀도의 손실 없이 변환됩니다.

라이브러리는 모든 cv-한정되지 않은 부동소수점 타입에 대해 std::nexttoward 의 오버로드를 매개변수 from 의 타입으로 제공합니다. 그러나 from 에 해당하는 인수가 확장 부동소수점 타입 을 가지는 경우, std::nexttoward 의 호출은 잘못된 형식입니다. 왜냐하면 다음으로 표현 가능한 값(또는 to )이 long double 로 표현 가능함이 보장되지 않기 때문입니다.

(C++23부터)
A) 추가적으로 std::nextafter 오버로드가 다른 모든 산술 타입 조합에 대해 제공됩니다.
B) 추가적인 std::nexttoward 오버로드가 모든 정수 타입에 대해 제공되며, 이들은 double 로 처리됩니다.

목차

매개변수

from, to - 부동 소수점 또는 정수 값

반환값

오류가 발생하지 않으면, from 의 다음 표현 가능한 값이 to 방향으로 반환됩니다. 만약 from to 와 같다면, to 가 반환됩니다.

오버플로로 인한 범위 오류가 발생하면, ±HUGE_VAL , ±HUGE_VALF , 또는 ±HUGE_VALL 가 반환됩니다 ( from 과 동일한 부호로).

언더플로로 인해 범위 오류가 발생하면 올바른 결과가 반환됩니다.

오류 처리

오류는 math_errhandling 에 명시된 대로 보고됩니다.

구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,

  • from 이 유한하지만 예상 결과가 무한대인 경우, FE_INEXACT FE_OVERFLOW 를 발생시킵니다.
  • from to 와 같지 않고 결과가 서브노멀 또는 0인 경우, FE_INEXACT FE_UNDERFLOW 를 발생시킵니다.
  • 어떤 경우든 반환되는 값은 현재 반올림 모드와 무관합니다.
  • from 또는 to 중 하나가 NaN인 경우 NaN이 반환됩니다.

참고 사항

POSIX는 오버플로우 및 언더플로우 조건이 범위 오류( errno 가 설정될 수 있음)라고 명시합니다.

IEC 60559는 from from == to 일 때마다 from 을 반환할 것을 권장합니다. 하지만 이 함수들은 대신 to 를 반환하여, 0 주변의 동작을 일관성 있게 만듭니다: std :: nextafter ( - 0.0 , + 0.0 ) + 0.0 을 반환하고, std :: nextafter ( + 0.0 , - 0.0 ) - 0.0 을 반환합니다.

std::nextafter 는 일반적으로 IEEE 표현 방식을 조작하여 구현됩니다 ( glibc , musl ).

추가적인 std::nextafter 오버로드는 반드시 (A) 와 동일하게 제공될 필요가 없습니다. 이들은 단지 첫 번째 인수 num1 와 두 번째 인수 num2 에 대해 다음을 보장하기에 충분하기만 하면 됩니다:

  • num1 또는 num2 long double 타입을 가지는 경우, std :: nextafter ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: nextafter ( static_cast < long double > ( num1 ) ,
    static_cast < long double > ( num2 ) )
    .
  • 그렇지 않고 num1 및/또는 num2 double 또는 정수 타입을 가지는 경우, std :: nextafter ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: nextafter ( static_cast < double > ( num1 ) ,
    static_cast < double > ( num2 ) )
    .
  • 그렇지 않고 num1 또는 num2 float 타입을 가지는 경우, std :: nextafter ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: nextafter ( static_cast < float > ( num1 ) ,
    static_cast < float > ( num2 ) )
    .
(C++23 이전)

num1 num2 이 산술 타입을 가지는 경우, std :: nextafter ( num1, num2 ) 은 다음 코드와 동일한 효과를 가집니다: std :: nextafter ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
static_cast < /*common-floating-point-type*/ > ( num2 ) )
, 여기서 /*common-floating-point-type*/ num1 num2 의 타입들 사이에서 가장 높은 부동소수점 변환 순위 와 가장 높은 부동소수점 변환 하위순위 를 가지는 부동소수점 타입이며, 정수 타입 인수들은 double 과 동일한 부동소수점 변환 순위를 가진 것으로 간주됩니다.

가장 높은 순위와 하위순위를 가지는 부동소수점 타입이 존재하지 않는 경우, 오버로드 해결 은 제공된 오버로드들 중에서 사용 가능한 후보를 결과로 내지 않습니다.

(C++23 이후)

추가적인 std::nexttoward 오버로드는 반드시 (B) 와 동일하게 제공될 필요가 없습니다. 이들은 정수 타입의 인자 num 에 대해, std :: nexttoward ( num ) std :: nexttoward ( static_cast < double > ( num ) ) 와 동일한 효과를 가지도록 보장하기에 충분하기만 하면 됩니다.

예제

#include <cfenv>
#include <cfloat>
#include <cmath>
#include <concepts>
#include <iomanip>
#include <iostream>
int main()
{
    float from1 = 0, to1 = std::nextafter(from1, 1.f);
    std::cout << "다음으로 표현 가능한 float 값은 " << std::setprecision(20) << from1
              << "는 " << to1
              << std::hexfloat << " (" << to1 << ")\n" << std::defaultfloat;
    float from2 = 1, to2 = std::nextafter(from2, 2.f);
    std::cout << "다음으로 표현 가능한 float 값은 " << from2 << "는 " << to2
              << std::hexfloat << " (" << to2 << ")\n" << std::defaultfloat;
    double from3 = std::nextafter(0.1, 0), to3 = 0.1;
    std::cout << "숫자 0.1은 두 개의 유효한 double 값 사이에 있습니다:\n"
              << std::setprecision(56) << "    " << from3
              << std::hexfloat << " (" << from3 << ')' << std::defaultfloat
**번역 결과:**
std::defaultfloat
**번역 설명:**
- HTML 태그와 속성은 그대로 유지
- ``, `` 태그 내부의 텍스트는 C++ 관련 용어이므로 번역하지 않음
- `std::defaultfloat`은 C++ 표준 라이브러리 매니퓰레이터로 전문 용어이므로 원문 유지
- 링크 구조와 클래스 속성 모두 원본 형식 그대로 보존
              << "\n및 " << to3 << std::hexfloat << "  (" << to3 << ")\n"
              << std::defaultfloat
**번역 결과:**
std::defaultfloat
**번역 설명:**
- HTML 태그와 속성은 그대로 유지
- `` 태그 내의 텍스트는 C++ 관련 용어이므로 번역하지 않음
- `std::defaultfloat`은 C++ 표준 라이브러리 매니퓰레이터로 원문 유지
- 전체 구조와 포맷팅 완벽하게 보존 << std::setprecision(20);
    std::cout << "\nnextafter와 nexttoward의 차이점:\n";
    long double dir = std::nextafter(from1, 1.0L); // 첫 번째 서브노멀 long double
    float x = std::nextafter(from1, dir); // 먼저 dir을 float로 변환하여 0을 제공합니다
    std::cout << "With nextafter, 다음 float 값은 " << from1 << "는 " << x << '\n';
    x = std::nexttoward(from1, dir);
    std::cout << "With nexttoward, 다음 float 값은 " << from1 << "는 " << x << '\n';
    std::cout << "\n특수 값:\n";
    {
        // #pragma STDC FENV_ACCESS ON
        std::feclearexcept(FE_ALL_EXCEPT);
        double from4 = DBL_MAX, to4 = std::nextafter(from4, INFINITY);
        std::cout << "다음으로 표현 가능한 double 값은 " << std::setprecision(6)
                  << from4 << std::hexfloat << " (" << from4 << ')'
                  << std::defaultfloat
**번역 결과:**
std::defaultfloat
**번역 설명:**
- HTML 태그와 속성은 그대로 유지
- C++ 특정 용어(std::defaultfloat)는 번역하지 않음
- 태그 내부의 텍스트도 C++ 용어이므로 번역하지 않음
- 링크 구조와 클래스 속성은 완전히 보존 << "는 " << to4
                  << std::hexfloat << " (" << to4 << ")\n" << std::defaultfloat
**번역 결과:**
std::defaultfloat
**번역 설명:**
- HTML 태그와 속성은 그대로 유지
- `` 태그 내의 텍스트는 C++ 관련 용어이므로 번역하지 않음
- `std::defaultfloat`은 C++ 표준 라이브러리 매니퓰레이터로 원문 그대로 보존;
        if (std::fetestexcept(FE_OVERFLOW))
            std::cout << "   FE_OVERFLOW가 발생했습니다\n";
        if (std::fetestexcept(FE_INEXACT))
            std::cout << "   FE_INEXACT가 발생했습니다\n";
    } // FENV_ACCESS 블록 종료
    float from5 = 0.0, to5 = std::nextafter(from5, -0.0);
    std::cout << "std::nextafter(+0.0, -0.0) gives " << std::fixed
**번역 결과:**
HTML 태그와 속성은 번역하지 않고 원본 형식을 유지합니다. ``, `
`, `` 태그 내의 텍스트는 번역하지 않습니다. C++ 관련 용어는 번역하지 않습니다. 정확성과 전문성을 요구합니다.
주어진 텍스트는 HTML 태그와 C++ 네임스페이스(`std::fixed`)로 구성되어 있어 번역 대상이 아닙니다. 따라서 원본을 그대로 유지합니다.
<< to5 << '\n'; auto precision_loss_demo = []<std::floating_point Fp>(const auto rem, const Fp start) { std::cout << rem; for (Fp from = start, to, Δ; (Δ = (to = std::nextafter(from, +INFINITY)) - from) < Fp(10.0); from *= Fp(10.0)) std::cout << "nextafter(" << std::scientific << std::setprecision(0) << from << ", INF) gives " << std::fixed << std::setprecision(6) << to << "; Δ = " << Δ << '\n'; }; precision_loss_demo("\nfloat의 정밀도 손실 데모:\n", 10.0f); precision_loss_demo("\ndouble에 대한 정밀도 손실 데모:\n", 10.0e9); precision_loss_demo("\nlong double에 대한 정밀도 손실 데모:\n", 10.0e17L); }

출력:

0 다음의 표현 가능한 다음 float 값은 1.4012984643248170709e-45 (0x1p-149)입니다.
1 다음의 표현 가능한 다음 float 값은 1.0000001192092895508 (0x1.000002p+0)입니다.
숫자 0.1은 두 개의 유효한 double 값 사이에 있습니다:
    0.09999999999999999167332731531132594682276248931884765625 (0x1.9999999999999p-4)
및 0.1000000000000000055511151231257827021181583404541015625  (0x1.999999999999ap-4)
nextafter와 nexttoward의 차이:
nextafter를 사용하면 0 다음의 다음 float 값은 0입니다
nexttoward를 사용하면 0 다음의 다음 float 값은 1.4012984643248170709e-45입니다
특수 값:
1.79769e+308 (0x1.fffffffffffffp+1023) 다음의 표현 가능한 다음 double 값은 inf (inf)입니다
   FE_OVERFLOW 발생
   FE_INEXACT 발생
std::nextafter(+0.0, -0.0)는 -0.000000을 제공합니다
float에 대한 정밀도 손실 데모:
nextafter(1e+01, INF)는 10.000001을 제공합니다; Δ = 0.000001
nextafter(1e+02, INF)는 100.000008을 제공합니다; Δ = 0.000008
nextafter(1e+03, INF)는 1000.000061을 제공합니다; Δ = 0.000061
nextafter(1e+04, INF)는 10000.000977을 제공합니다; Δ = 0.000977
nextafter(1e+05, INF)는 100000.007812을 제공합니다; Δ = 0.007812
nextafter(1e+06, INF)는 1000000.062500을 제공합니다; Δ = 0.062500
nextafter(1e+07, INF)는 10000001.000000을 제공합니다; Δ = 1.000000
nextafter(1e+08, INF)는 100000008.000000을 제공합니다; Δ = 8.000000
double에 대한 정밀도 손실 데모:
nextafter(1e+10, INF)는 10000000000.000002을 제공합니다; Δ = 0.000002
nextafter(1e+11, INF)는 100000000000.000015을 제공합니다; Δ = 0.000015
nextafter(1e+12, INF)는 1000000000000.000122을 제공합니다; Δ = 0.000122
nextafter(1e+13, INF)는 10000000000000.001953을 제공합니다; Δ = 0.001953
nextafter(1e+14, INF)는 100000000000000.015625을 제공합니다; Δ = 0.015625
nextafter(1e+15, INF)는 1000000000000000.125000을 제공합니다; Δ = 0.125000
nextafter(1e+16, INF)는 10000000000000002.000000을 제공합니다; Δ = 2.000000
long double에 대한 정밀도 손실 데모:
nextafter(1e+18, INF)는 1000000000000000000.062500을 제공합니다; Δ = 0.062500
nextafter(1e+19, INF)는 10000000000000000001.000000을 제공합니다; Δ = 1.000000
nextafter(1e+20, INF)는 100000000000000000008.000000을 제공합니다; Δ = 8.000000

참고 항목

C 문서 for nextafter