2017-01-04 13 views

Odpowiedz

17

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 
+3

Przykładowa odpowiedź. Dokładny i bardzo dokładny. – amalloy

+2

Aby zakończyć: Istnieje również "* niezatwierdzona-matematyka", która może być ustawiona na "true" – ClojureMostly

Powiązane problemy