2010-09-16 34 views
9

Tôi nhận đoạn mã này từ một số nơi khác. Theo quản trị viên web, mã được chọn từ The art of computer programming by KnuthSự khác biệt trong khoảngEqual và basicEqual trong Nghệ thuật lập trình máy tính

Vì tôi không có bản sao của cuốn sách đó, tôi có thể biết sự khác nhau giữa hai chức năng không?

bool approximatelyEqual(float a, float b, float epsilon) 
{ 
    return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon); 
} 

bool essentiallyEqual(float a, float b, float epsilon) 
{ 
    return fabs(a - b) <= ((fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon); 
} 

Trả lời

11

Để đưa ra một ví dụ:

double a = 95.1, b = 100.0; 
assert(approximatelyEqual(a, b, 0.05)); 
assert(!essentiallyEqual(a, b, 0.05)); 

Đó là, với epsilon là 5%, 95,1 là khoảng 100, vì nó nằm trong biên độ 5% trong số 100 giá trị (lớn nhất). Mặt khác, 95,1 không thực chất là 100, vì 100 không chênh lệch 5% so với 95,1 (giá trị nhỏ nhất).

+0

Tôi có thể nói, về cơ bảnEqual sẽ luôn cần giá trị 'gần hơn' so với xấp xỉEqual? –

+0

Có, giá trị 'basicEqual' sẽ luôn" gần hơn "so với giá trị' approxEqual'. – palswim

+3

Hãy suy nghĩ về các phiếu mua hàng tại cửa hàng thông thường của bạn và tỷ lệ phần trăm có ý nghĩa như thế nào. Giảm giá 33% có giá trị hơn trong giá hoặc thêm 33% sản phẩm miễn phí là gì? Giải pháp là bạn nên ưu tiên giảm giá 33% vì tương đương với ưu đãi thêm 50% sản phẩm miễn phí. Điều tương tự xảy ra ở đây, tùy thuộc vào việc bạn lấy epsilon xung quanh lớn hơn hoặc nhỏ nhất trong hai giá trị kết quả sẽ khác nhau. 66,6 tương đương 100 với epsilon 33%, nhưng về cơ bản chỉ bằng một epsilon 50%. –

9

approximatelyEqual cho dù sự khác biệt giữa ab là nhỏ hơn so với lỗi chấp nhận được (epsilon), được xác định bởi phần lớn hơn trong a hoặc b. Điều này có nghĩa là hai giá trị này là "đủ gần" và chúng ta có thể nói rằng chúng có giá trị bằng nhau.

essentiallyEqual cho dù sự khác biệt giữa ab là nhỏ hơn so với lỗi chấp nhận được (epsilon), xác định bởi nhỏ hơn của a hoặc b. Điều này có nghĩa rằng các giá trị khác nhau nhỏ hơn sự khác biệt có thể chấp nhận được trong bất kỳ phép tính nào, do đó có lẽ chúng không thực sự bằng nhau, nhưng chúng "về cơ bản là bằng nhau" (với số epsilon).

Ứng dụng này có các sự cố trong đó chúng tôi có dữ liệu và tỷ lệ "lỗi có thể chấp nhận" và như vậy. Mã này chỉ cung cấp cho bạn định nghĩa thuật toán của các thuật ngữ đó.

+0

Bạn có thể đưa ra một ví dụ thế giới thực, cách chúng ta nên chọn trong số 2 chức năng này? –

+0

'Điều này có nghĩa rằng các giá trị khác nhau nhỏ hơn chênh lệch chấp nhận được trong bất kỳ phép tính' nào - nếu các giá trị khác nhau nhỏ hơn, điều này cũng có nghĩa là' đủ gần'? Vì vậy, những gì nó sẽ khác với 'approxEqual'? –

+0

Đây là [bài báo y khoa] (http://www.pnas.org/content/95/3/811.full) sử dụng cả hai thuật ngữ. Nó không nhất thiết phải chọn cách nào, nhưng đó cũng là cách bạn mô tả dữ liệu. – palswim

3

Sự khác biệt là bình đẳng cần thiết ngụ ý gần đúng bình đẳng, nhưng không phải ngược lại. Vì vậy, bình đẳng cần thiết là mạnh hơn bình đẳng gần đúng.

Cũng bình đẳng cần thiết không phải là bắc cầu, nhưng nếu a là về cơ bản tương đương với bb là về cơ bản tương đương với c, sau đó a là xấp xỉ bằng c (đối với một giá trị của epsilon).

+0

+1 cho phân tích chéo –

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