Подтвердить что ты не робот

Как std:: nextafter() в С++ 11 создает меньшие значения, чем std:: numeric_limits:: min?

Я только заметил, что std::nextafter(0, 1) в моей системе, похоже, создает значение больше 0 и ниже std::numeric_limits::min().

Как это возможно? Я думал, что min() возвращает наименьшее возможное число, большее 0.

#include <iostream>

int main(int argc, char *argv[])
{
    double next = std::nextafter(0.0, 1.0);
    double min = std::numeric_limits<double>::min();
    std::cout << "next: " << next << "\nmin:  " << min << "\nnext<min: " << (next < min) << "\nnext>0:   " << (next > 0.0) << std::endl;
}

Вывод:

next: 4.94066e-324
min:  2.22507e-308
next<min: 1
next>0:   1

Мой компилятор - MinGW 5.3.0 32bit.

4b9b3361

Ответ 1

std::nextafter() разрешено возвращать субнормальное число (в вашем случае наименьшее субормальное число, так как вы перемещаетесь в направлении вверх от нуля), тогда как std::numeric_limits::min() - наименьшее не субнормальное число.

Ссылка: http://en.cppreference.com/w/cpp/numeric/math/nextafter