I matematyka, x <= y
jest odpowiednikiem !(x > y)
. Dotyczy to arytmetyki zmiennoprzecinkowej, w większości przypadków, ale nie zawsze. Gdy x
lub y
jest NaN, x <= y
jest nie równoważne !(x > y)
, ponieważ porównywanie NaN
do niczego zawsze zwraca false
. Ale nadal, x <= y <=> !(x > y)
jest prawdziwe przez większość czasu.Najlepszy sposób na uniknięcie powielania kodu definiującego operatory porównania `<, <=, >,> =, ==,! =`, Ale biorąc pod uwagę NaNs?
Załóżmy teraz, że piszę klasę zawierającą wartości zmiennoprzecinkowe i chcę zdefiniować operatorów porównania dla tej klasy. W celu określenia, przypuśćmy, że piszę wysokiej precyzji liczba zmiennoprzecinkowa, która używa wewnętrznie jednej lub więcej wartości double
do przechowywania wysokiej precyzji. Matematycznie definicja x < y
dla tej klasy już definiuje wszystkie inne operatory (jeśli jestem w zgodzie ze zwykłą semantyką operatorów porównania). Ale NaN
s przełamać tę matematyczną delikatność. Więc może jestem zmuszony napisać wielu z tych operatorów osobno, żeby wziąć pod uwagę NaN. Ale czy istnieje lepszy sposób? Moje pytanie brzmi: Jak mogę uniknąć powielania kodu w jak największym stopniu i nadal szanować zachowanie NaN
?
Powiązane: http://www.boost.org/doc/libs/1_59_0/libs/utility/operators.htm. W jaki sposób funkcja boost/operatorzy rozwiązuje ten problem?
Uwaga: To pytanie zostało oznaczone jako c++
, ponieważ to właśnie rozumiem. Napisz przykłady w tym języku.
Powiązane: http://stackoverflow.com/a/29269216/855050. Ta odpowiedź stanowi zadowalające rozwiązanie dla typów integralnych. Ale nie działa dla zmiennoprzecinkowej z powodu NaN. – becko