2011-01-13 26 views
5

Về cơ bản tôi muốn tìm kiếm giá trị nhỏ nhất (dương) từ một loạt các giá trị và cần một giá trị mặc định để so sánh với giá trị đầu tiên. Giả định ngây thơ sẽ là, họ luôn luôn so sánh "ít hơn" (trừ NaN, nhưng chúng ta không xem xét những người) nhưng tôi không khá chắc chắn.Làm thế nào để các giá trị dấu phẩy động tùy ý so sánh với vô cực?

Tôi đang sử dụng loại float và tôi nghĩ rằng nó có thể được giả định một cách an toàn rằng phần cứng đích của tôi thực hiện một giá trị vô hạn.

Dưới đây là một số mã ví dụ:

auto leastValue = std::numeric_limits<float>::infinity(); 
for (auto i = something.begin(), e = something.end(); i != e; ++i) 
{ 
    auto value = (*i)->GetValue(); 
    if (value < leastValue) 
    { 
    leastValue = value; 
    } 
} 
+4

Bạn cũng có thể chỉ sử dụng giá trị đầu tiên làm giá trị ban đầu của mình. Nó rất có thể sẽ vẫn hoạt động nếu bạn đặt vào vô cùng; Tôi chỉ chỉ ra rằng bạn không thực sự * cần * để sử dụng một giá trị sinh dục đặc biệt. –

+0

Với việc kéo 'i' ra khỏi vòng lặp và thêm một kiểm tra bổ sung cho một bộ sưu tập trống, tôi có thể. Nhưng sẽ không làm cho câu hỏi vô dụng? ;) – kiw

+0

Sử dụng 'std :: min_element' và để nó lo lắng về những thứ như thế? –

Trả lời

8

Đối với IEEE 754 nổi, trừ NaN và vô cực, mọi thứ đều nhỏ hơn vô cùng. Rất có thể bạn sẽ có những người trên nền tảng của mình. Nếu bạn hoang tưởng, hãy kiểm tra với numeric_limits<float>::is_iec559. Nếu nền tảng của bạn không phù hợp, hãy sử dụng numeric_limits<float>::max(); nếu trình tự của bạn là nonempty, nó sẽ không cho bạn một kết quả sai.

2

Tôi ủng hộ Michael Madsen bình luận: Bạn không cần phải là một giá trị vô hạn cho thử nghiệm này,

Store giá trị đầu tiên của bó của bạn trong một biến và sau đó bắt đầu thử nghiệm của bạn với các giá trị thứ hai của loạt. (và nó thậm chí sẽ giúp bạn tiết kiệm một thử nghiệm: P)

0

Tôi nghĩ điều này phụ thuộc vào hành vi bạn mong đợi nếu trình tự trống. Nếu bạn muốn vô cùng thì việc triển khai của bạn là tốt, nếu không bạn nên sử dụng giá trị đầu tiên.

auto i = something.begin(); 
auto e = semething.end(); 
if (i == e) 
    throw std::exception("empty sequence"); 

auto leastValue = (*i)->GetValue(); 

for (++i; i != e; ++i) 
{ 
    auto value = (*i)->GetValue(); 
    if (value < leastValue) 
    { 
    leastValue = value; 
    } 
} 
+0

Infinity thực tế là câu trả lời đúng nếu trình tự trống. Nó cũng có thể là câu trả lời đúng nếu trình tự không rỗng, bởi vì không phải tất cả các phần tử đều tạo ra một giá trị (không nằm trong mã ví dụ của tôi). – kiw

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