首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::nexttoward

Defined in header <cmath>

?

?

float nextafter( float from, float to );

(1)

(since C++11)

double nextafter( double from, double to );

(2)

(since C++11)

long double nextafter( long double from, long double to );

(3)

(since C++11)

Promoted nextafter( Arithmetic from, Arithmetic to );

(4)

(since C++11)

float nexttoward( float from, long double to );

(5)

(since C++11)

double nexttoward( double from, long double to );

(6)

(since C++11)

long double nexttoward( long double from, long double to );

(7)

(since C++11)

double nexttoward( Integral from, long double to );

(8)

(since C++11)

的下一个可表示值from向…的方向to...

1-3%29from等于to,,,to会被归还。

5-7%29from等于to,,,to返回,转换为long double函数的返回类型,而不丢失范围或精度。

4%29一组重载或函数模板,用于%281-3%29中未涵盖的所有算术类型参数组合。如果有任何争论积分型,它被铸造成double.如果有任何争论long double,则返回类型Promoted也是long double,否则返回类型总是double...

8%29一组重载或接受from任何论点积分型等效于%286%29%28的参数转换为double29%。

参数

from, to

-

floating point values

返回值

如果没有发生错误,则下一个可表示的值from向…的方向to.被归还。如果from等号to,然后to会被归还。

如果溢出导致范围错误,±HUGE_VAL,,,±HUGE_VALF,或±HUGE_VALL返回%28,其符号与from29%。

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

错误处理

错误按数学[医]错误处理...

如果实现支持ieee浮点算法%28IEC 60559%29,

  • 如果from是有限的,但预期的结果是无穷大的。FE_INEXACTFE_OVERFLOW
  • 如果from不等于to结果是低于正常值或者为零,FE_INEXACTFE_UNDERFLOW
  • 在任何情况下,返回的值都与当前舍入模式无关。
  • 如果fromto是南,南回来了

注记

POSIX指定溢出和下溢条件为范围错误%28 errno可设置为%29。

iec 60559建议from将在任何时候返回。from==to.这些功能返回to相反,这使得在零附近的行为保持一致:std::nextafter(-0.0, +0.0)回报+0.0std::nextafter(+0.0, -0.0)回报–0.0...

二次

代码语言:javascript
复制
#include <cmath>
#include <iomanip>
#include <iostream>
#include <cfloat>
#include <cfenv>
 
int main()
{
    float from1 = 0, to1 = std::nextafter(from1, 1.f);
    std::cout << "The next representable float after " << std::setprecision(20) << from1
              << " is " << to1
              << std::hexfloat << " (" << to1 << ")\n" << std::defaultfloat;
 
    float from2 = 1, to2 = std::nextafter(from2, 2.f);
    std::cout << "The next representable float after " << from2 << " is " << to2
              << std::hexfloat << " (" << to2 << ")\n" << std::defaultfloat;
 
    double from3 = std::nextafter(0.1, 0), to3 = 0.1;
    std::cout << "The number 0.1 lies between two valid doubles:\n"
              << std::setprecision(56) << "    " << from3
              << std::hexfloat << " (" << from3 << ')' << std::defaultfloat
              << "\nand " << to3 << std::hexfloat << " (" << to3 << ")\n"
              << std::defaultfloat << std::setprecision(20);
 
    // difference between nextafter and nexttoward:
    long double dir = std::nextafter(from1, 1.0L); // first subnormal long double
    float x = nextafter(from1, dir); // first converts dir to float, giving 0
    std::cout << "With nextafter, next float after " << from1 << " is " << x << '\n';
    x = std::nexttoward(from1, dir);
    std::cout << "With nexttoward, next float after " << from1 << " is " << x << '\n';
 
    // special values
    {
        #pragma STDC FENV_ACCESS ON
        std::feclearexcept(FE_ALL_EXCEPT);
        double from4 = DBL_MAX, to4 = std::nextafter(from4, INFINITY);
        std::cout << "The next representable double after " << std::setprecision(6)
                  << from4 << std::hexfloat << " (" << from4 << ')'
                  << std::defaultfloat << " is " << to4
                  << std::hexfloat << " (" << to4 << ")\n" << std::defaultfloat;
        if(std::fetestexcept(FE_OVERFLOW)) std::cout << "   raised FE_OVERFLOW\n";
        if(std::fetestexcept(FE_INEXACT)) std::cout << "   raised FE_INEXACT\n";
    } // end FENV_ACCESS block
 
    float from5 = 0.0, to5 = std::nextafter(from5, -0.0);
    std::cout << "std::nextafter(+0.0, -0.0) gives " << std::fixed << to5 << '\n';
}

二次

产出:

二次

代码语言:javascript
复制
The next representable float after 0 is 1.4012984643248170709e-45 (0x1p-149)
The next representable float after 1 is 1.0000001192092895508 (0x1.000002p+0)
The number 0.1 lies between two valid doubles:
    0.09999999999999999167332731531132594682276248931884765625 (0x1.9999999999999p-4)
and 0.1000000000000000055511151231257827021181583404541015625 (0x1.999999999999ap-4)
With nextafter, next float after 0 is 0
With nexttoward, next float after 0 is 1.4012984643248170709e-45
The next representable double after 1.79769e+308 (0x1.fffffffffffffp+1023) is inf (inf)
   raised FE_OVERFLOW
   raised FE_INEXACT
std::nextafter(+0.0, -0.0) gives -0.000000

二次

另见

C以后的文档

*。

代码语言:txt
复制
 ? cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com