Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm isless() trong C/C++

isless(x, y) kiểm tra x < y cho floating-point, không ném ngoại lệ (quiet) khi đối số là NaN. Header: <math.h> / <cmath>.

Cú pháp

// C (macro)
int isless(real-floating x, real-floating y);

// C++ (overload)
bool isless(float x, float y);
bool isless(double x, double y);
bool isless(long double x, long double y);

Ví dụ

#include <stdio.h>
#include <math.h>

int main() {
    int val1 = 48;
    float val2 = 324.32f;
    
    if (isless(val1, val2))
        printf("val1 < val2\n");
    else
        printf("val1 >= val2\n");
    
    // Test với NaN
    double nan = nan("");
    printf("isless(NaN, 5) = %d\n", isless(nan, 5.0)); // 0
    printf("isless(5, NaN) = %d\n", isless(5.0, nan)); // 0
    printf("5 < NaN (operator) = %d\n", 5.0 < nan);    // 0 (nhưng có thể raise FE_INVALID)
    
    return 0;
}

Kết quả

val1 < val2
isless(NaN, 5) = 0
isless(5, NaN) = 0
5 < NaN (operator) = 0

So sánh với operator <

Các hàm quiet comparison khác

  • isgreater(x, y) - x > y
  • islessequal(x, y) - x ≤ y
  • isgreaterequal(x, y) - x ≥ y
  • islessgreater(x, y) - x < y ∨ x > y (x ≠ y)
  • isunordered(x, y) - x hoặc y là NaN

Khi nào dùng isless()?

  • So sánh floating-point trong tính toán khoa học, graphics, simulation
  • Khi NaN là giá trị hợp lệ (không phải lỗi) và không muốn trigger FP exception
  • Viết generic code xử lý float/double/long double
  • Kết hợp với isunordered để logic hoàn chỉnh:
    if (isunordered(a, b)) { /* handle NaN */ }
    else if (isless(a, b)) { /* a < b */ }
    else { /* a >= b */ }

Lưu ý

  • C99/C++11 trở lên
  • Có thể implement dưới dạng macro (C) hoặc function (C++)
  • Không thay thế hoàn toàn < cho code bình thường (verbose hơn)
  • Performance: tương đương hoặc chậm hơn nhẹ do function call (inline có thể loại bỏ)
Trường hợpisless(x,y)x < y
Bình thường (x < y)truetrue
Bình thường (x >= y)falsefalse
x là NaNfalse (quiet)false (có thể raise FE_INVALID)
y là NaNfalse (quiet)false (có thể raise FE_INVALID)
Cả hai NaNfalse (quiet)false (có thể raise FE_INVALID)