w tym przypadku zwraca liczbę większą niż argument sprzeczny z definicją.
Zwraca liczbę równą jej argumentowi. Jak powiedziałeś, chodzi o podwójną precyzję. Liczby 3.9999999999999999 i 4 są po prostu równe sobie w ramach 64-bitowych reguł zmiennoprzecinkowych.
ale to nie powinien skompilować podane znaczenie typu Haskell bezpieczeństwa
Problem polega na tym, że jak literały ułamkowe mają polimorficzne typu Fractional a => a
. To nie muszą być duble. Na przykład możesz napisać floor (3.9999999999999999 :: Rational)
, który poprawnie zwróci 3, ponieważ 3.9999999999999999 może być reprezentowany jako Rational
bez utraty dokładności.
Jeśli Haskell popełnił błąd podczas pisania 3.9999999999999999
, to również nie można zapisać 3.9999999999999999 :: Rational
, co byłoby złe. Ponieważ literał Fractional
może być reprezentowany przy użyciu wielu różnych typów, z których niektóre mają nieskończoną dokładność, byłoby dużym błędem dla Haskella ograniczenie liczby legalnych Fractional
literałów w oparciu o ograniczenia Double
.
Można argumentować, że Haskell powinien ograniczyć 3.9999999999999999
, gdy jest używany jako Double
, ale nie, gdy jest używany Rational
. Wymagałoby to jednak wystąpienia klasy typu Fractional
w celu zadeklarowania informacji na temat ich dokładności (aby Haskell mógł wykorzystać te informacje do podjęcia decyzji, czy dany tekst jest ważny dla tego typu), którego obecnie nie ma i które byłoby trudne (lub niemożliwe).) w celu wdrożenia w sposób ogólny, skuteczny i przyjazny dla użytkownika (biorąc pod uwagę, że termin "precyzja" może oznaczać całkiem różne rzeczy w zależności od tego, czy mówimy o liczbach zmiennoprzecinkowych, czy o stałych numerach punktów i czy używają bazy 2 lub 10 (lub cokolwiek innego) do reprezentowania liczb - każda z nich byłaby możliwa dla wystąpień klasy typu Fractional
).
Bez względu na to, ile bitów Twój zmiennoprzecinkowa ma format liczbowy, jest skończony i zaokrąglić stałych nie może dokładnie reprezentują. Wydaje się, że "3,9999999999999999" jest zaokrąglone do "4.0", gdy jest konwertowane na podwójne, zanim jeszcze "floor" to zobaczy. – tauli