Istnieje kilka funkcji matematycznych zakończonych apostrofem, takich jak: +'
, *'
i -'
.Jakie funkcje matematyczne kończą się apostrofem w Clojure?
Jaka jest różnica między nie apostrofami i apostrofami?
Istnieje kilka funkcji matematycznych zakończonych apostrofem, takich jak: +'
, *'
i -'
.Jakie funkcje matematyczne kończą się apostrofem w Clojure?
Jaka jest różnica między nie apostrofami i apostrofami?
Są to "automatycznie promujące" wersje normalnych funkcji matematycznych.
user> (* Long/MAX_VALUE 2)
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)
user> (*' Long/MAX_VALUE 2)
18446744073709551614N
Zwrócą większy typ danych niż dane wejściowe, jeśli wyjście stanie się zbyt duże. To było domyślne zachowanie na początku Clojure, a następnie zmieniono je tak, aby wyrzucał wyjątek, jeśli wynik działania matematycznego przepełnił jego typ danych. Ta ulepszona wydajność numeryczna i ogólnie pomogła znaleźć błędy. W ciągu pięciu lat od tego czasu zaskakująco niewielu ludzi narzekało na tę zmianę. Postanowiono zachować zachowanie wyrzucania wyjątku na przepełnienie, ponieważ prawie zawsze jest to błąd.
W praktyce przez większość czasu będziesz wiedzieć, kiedy będziesz potrzebować BigIntegers i BigDecimals i będziesz mógł używać normalnych funkcji z tymi typami danych.
user> (* Long/MAX_VALUE 2N)
18446744073709551614N
W tym przykładzie użyłem normalnego *
funkcję, i przekazał go argument, który był typu BigInteger (to co N
w 2N
oznacza dla Clojure-reader)
Istnieje kilka przypadków tam, gdzie naprawdę potrzebujesz pracować z dowolnym numerem rozmiaru, nie wiedząc, że jest to rozmiar z góry i te funkcje są przydatne. Do tej pory większość z tych przykładów to przykłady silni na StackOverflow.
Jeśli naprawdę chcesz, aby operacja matematyki do przepełnienia następnie można użyć jawnie niebezpieczne funkcje matematyczne:
user> (unchecked-add Long/MAX_VALUE 2)
-9223372036854775807
Przykładowa odpowiedź. Dokładny i bardzo dokładny. – amalloy
Aby zakończyć: Istnieje również "* niezatwierdzona-matematyka", która może być ustawiona na "true" – ClojureMostly