Załóżmy, że mam dwa obiekty i
i f
odpowiednich typów I
i F
. Wiem, że std::is_integral<I>::value
jest prawdziwe, a std::is_floating_point<F>::value
jest prawdziwe.Zgodny ze standardami sposób porównywania wartości zmiennoprzecinkowej z całkową?
Czy istnieje w pełni zgodne ze standardami sposobem, aby dowiedzieć się, jeżeli wartość i
jest mniejsza niż wartość f
? Zwróć uwagę na nacisk "w pełni zgodny ze standardami", w tym pytaniu interesują mnie jedynie odpowiedzi wspierane przez gwarancje ze standardu C++.
trywialne realizacja i < I(f)
nie działa, ponieważ wartość f
nie może zmieścić i
. Brawurowe wdrożenie F(i) < f
również nie działa, ponieważ precyzja f
może nie wystarczyć do reprezentowania i
, powodując, że i
zostanie zaokrąglone do wartości równej f
(jeśli masz pływające IEEE754, to zawiedzie 16777219 < 16777220.f
).
Ale tu pojawia się prawdziwy dylemat: jeśli chcesz użyć std::numeric_limits::max
, aby złagodzić te problemy, powróć do pierwotnego problemu porównywania wartości liczbowych i liczb całkowitych! Dzieje się tak, ponieważ typ std::numeric_limits::max
jest równy typowi oryginalnemu.
Wymóg „na to pytanie Jestem zainteresowany tylko w odpowiedzi, które są poparte gwarancjami C++ standard” jest nieuzasadnione i głupi na to pytanie. Jest to podobne do pytania o sposób implementacji sortowania bąbelkowego i wymaga, aby odpowiedzi były wspierane przez standard C++. Standard C++ nie ma nic do powiedzenia na temat rodzaju bąbelków. –
'i
Barry
@ Cheersandhth.-Alf Nie zgadzam się. Cała kwestia polega na znalezieniu metody dobrze zdefiniowanej w dowolnej implementacji C++. Możesz to zrobić dla sortowania bąbelkowego, ale nie jestem pewien, czy możesz to porównać, stąd moje pytanie. – orlp