2015-06-15 14 views
8

Có cách nào ưu tiên để thực hiện xác nhận với hai số dấu phẩy động và một delta trong Rust?assert_eq! với số dấu chấm động và delta

Ví dụ ...

let a = 3.0; 
let b = 2.9999999999; 
assert_eq!(a, b, 0.0001); // Imaginary syntax where a ~= b, within 0.0001 
+8

Hãy coi chừng [sử dụng epsilons (lề lỗi tuyệt đối) để so sánh điểm trôi nổi] (http://floating-point-gui.de/errors/comparison/). – Shepmaster

Trả lời

3

Không có sẵn in2ilt macro cho nó, nhưng bạn có thể tạo của riêng bạn.

Sau đây là việc triển khai phiên bản "lỗi tuyệt đối" được mô tả trong this article.

macro_rules! assert_delta { 
    ($x:expr, $y:expr, $d:expr) => { 
     if !($x - $y < $d || $y - $x < $d) { panic!(); } 
    }, 
} 

Cụ thể, vĩ mô assert_delta hoảng loạn nếu cả hai sự khác biệt giữa xyyx là lớn hơn hoặc bằng d (các "đồng bằng" hay giá trị "epsilon", ví dụ: khả năng chịu đựng).

Đây là một cách xấu để làm điều đó bởi vì một epsilon cố định, lựa chọn vì nó "có vẻ nhỏ", trên thực tế có thể là cách quá lớn khi các con số được so sánh là rất nhỏ là tốt. So sánh sẽ trả về "true" cho các số khác nhau. Và khi các con số rất lớn, epsilon có thể kết thúc nhỏ hơn lỗi làm tròn nhỏ nhất, để so sánh luôn trả về "sai".

Do việc thực hiện trước đó bị hỏng trong các trường hợp khác nhau, nói chung, bạn nên không sử dụng số. Bạn có thể muốn triển khai macro mạnh mẽ hơn, ví dụ: một trong đó kiểm tra cho một "lỗi tương đối".

+1

như được hiển thị trong liên kết @ Shepmaster, đây chính là phiên bản "đơn giản" sẽ phá vỡ trong các tình huống khác nhau (phao nhỏ, nans, infs, ...) –

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