Skip to content

Commit 2a08ef4

Browse files
puredangerstuarthalloway
authored andcommitted
CLJ-1371 Add checks in divide(Object, Object) to check for NaN
Signed-off-by: Stuart Halloway <stu@cognitect.com>
1 parent d10a9d3 commit 2a08ef4

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

src/jvm/clojure/lang/Numbers.java

+5
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ static public Number multiplyP(Object x, Object y){
153153
}
154154

155155
static public Number divide(Object x, Object y){
156+
if (isNaN(x)){
157+
return (Number)x;
158+
} else if(isNaN(y)){
159+
return (Number)y;
160+
}
156161
Ops yops = ops(y);
157162
if(yops.isZero((Number)y))
158163
throw new ArithmeticException("Divide by zero");

test/clojure/test_clojure/numbers.clj

+70
Original file line numberDiff line numberDiff line change
@@ -809,3 +809,73 @@ Math/pow overflows to Infinity."
809809
(<= 1000 Double/NaN) (<= 1000 (Double. Double/NaN))
810810
(> 1000 Double/NaN) (> 1000 (Double. Double/NaN))
811811
(>= 1000 Double/NaN) (>= 1000 (Double. Double/NaN))))
812+
813+
(deftest test-nan-as-operand
814+
(testing "All numeric operations with NaN as an operand produce NaN as a result"
815+
(let [nan Double/NaN
816+
onan (cast Object Double/NaN)]
817+
(are [x] (Double/isNaN x)
818+
(+ nan 1)
819+
(+ nan 0)
820+
(+ nan 0.0)
821+
(+ 1 nan)
822+
(+ 0 nan)
823+
(+ 0.0 nan)
824+
(+ nan nan)
825+
(- nan 1)
826+
(- nan 0)
827+
(- nan 0.0)
828+
(- 1 nan)
829+
(- 0 nan)
830+
(- 0.0 nan)
831+
(- nan nan)
832+
(* nan 1)
833+
(* nan 0)
834+
(* nan 0.0)
835+
(* 1 nan)
836+
(* 0 nan)
837+
(* 0.0 nan)
838+
(* nan nan)
839+
(/ nan 1)
840+
(/ nan 0)
841+
(/ nan 0.0)
842+
(/ 1 nan)
843+
(/ 0 nan)
844+
(/ 0.0 nan)
845+
(/ nan nan)
846+
(+ onan 1)
847+
(+ onan 0)
848+
(+ onan 0.0)
849+
(+ 1 onan)
850+
(+ 0 onan)
851+
(+ 0.0 onan)
852+
(+ onan onan)
853+
(- onan 1)
854+
(- onan 0)
855+
(- onan 0.0)
856+
(- 1 onan)
857+
(- 0 onan)
858+
(- 0.0 onan)
859+
(- onan onan)
860+
(* onan 1)
861+
(* onan 0)
862+
(* onan 0.0)
863+
(* 1 onan)
864+
(* 0 onan)
865+
(* 0.0 onan)
866+
(* onan onan)
867+
(/ onan 1)
868+
(/ onan 0)
869+
(/ onan 0.0)
870+
(/ 1 onan)
871+
(/ 0 onan)
872+
(/ 0.0 onan)
873+
(/ onan onan)
874+
(+ nan onan)
875+
(+ onan nan)
876+
(- nan onan)
877+
(- onan nan)
878+
(* nan onan)
879+
(* onan nan)
880+
(/ nan onan)
881+
(/ onan nan) ))))

0 commit comments

Comments
 (0)