2017-09-01 21 views
13

Właśnie zauważyłem, że std::nextafter(0, 1) w moim systemie wydaje się wytwarzać wartość większą niż 0 i niższą niż std::numeric_limits::min().W jaki sposób std :: nextafter() w C++ 11 może generować mniejsze wartości niż std :: numeric_limits :: min?

Jak to jest możliwe? Myślałem min() zwraca najmniejszą możliwą liczbę większą niż 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; 
} 

Wyjście:

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

Mój kompilator MinGW 5.3.0 32bit.

+1

Dobre pytanie i kochajcie swoje imię! – Bathsheba

Odpowiedz

17

std::nextafter() może zwrócić słabszą od prawidłowej numer (w razie najmniejszą liczbę słabszą od prawidłowej, ponieważ jesteś przejeżdżające w kierunku do góry od zera), natomiast std::numeric_limits::min() jest najmniejsza liczba non-nienormalny.

Numer referencyjny: http://en.cppreference.com/w/cpp/numeric/math/nextafter

+2

Zauważ, że liczby podnormalne są prawdziwym bólem. – Yakk

+0

@Yakk; Rzeczywiście, ale robią bardzo dobre pytania dotyczące quizu pubowego, takie jak ten. – Bathsheba

Powiązane problemy