2017-09-01 15 views
13

Tôi vừa nhận thấy rằng std::nextafter(0, 1) trên hệ thống của tôi dường như tạo ra một giá trị lớn hơn 0 và thấp hơn std::numeric_limits::min().Làm thế nào có thể std :: nextafter() trong C++ 11 tạo ra các giá trị nhỏ hơn std :: number_limits :: min?

Làm cách nào có thể? Tôi nghĩ min() trả về số nhỏ nhất có thể lớn hơn 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; 
} 

Output:

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

trình biên dịch của tôi là MinGW 5.3.0 32bit.

+1

Câu hỏi hay và yêu thích tên của bạn! – Bathsheba

Trả lời

17

std::nextafter() được phép trở về một subnormal số (trong trường hợp của bạn số subnormal nhỏ nhất kể từ khi bạn đang đi qua theo hướng lên từ số không), trong khi std::numeric_limits::min() là số không subnormal nhỏ nhất.

Tham chiếu: http://en.cppreference.com/w/cpp/numeric/math/nextafter

+2

Lưu ý rằng các số không bình thường là một nỗi đau thực sự. – Yakk

+0

@Yakk; Thật vậy, nhưng họ làm cho câu hỏi bài kiểm tra quán rượu rất tốt như thế này. – Bathsheba

Các vấn đề liên quan