From c13116bb5ce8b8e146af4e8ae95955217213407c Mon Sep 17 00:00:00 2001 From: Gal Tsubery Date: Tue, 27 Dec 2016 01:22:59 -0600 Subject: [PATCH] Fix ceil function with zero as input Zero has sepcial encoding as IEEE754 floating point number with a 0 value for exponent. This encoding requires special handling in current Float.round implementation. --- lib/elixir/lib/float.ex | 3 ++- lib/elixir/test/elixir/float_test.exs | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/elixir/lib/float.ex b/lib/elixir/lib/float.ex index d2810b187f..785abda7ea 100644 --- a/lib/elixir/lib/float.ex +++ b/lib/elixir/lib/float.ex @@ -203,7 +203,8 @@ defmodule Float do count = count - exp + 1023 cond do - count <= 0 -> # There is no decimal precision + count <= 0 or # There is no decimal precision + (0 == exp and <<0::52>> == significant) -> #zero or minus zero float count >= 104 -> # Precision beyond 15 digits diff --git a/lib/elixir/test/elixir/float_test.exs b/lib/elixir/test/elixir/float_test.exs index fad96ce8b2..6b99c38497 100644 --- a/lib/elixir/test/elixir/float_test.exs +++ b/lib/elixir/test/elixir/float_test.exs @@ -80,6 +80,7 @@ defmodule FloatTest do assert Float.ceil(0.32453e-10) === 1.0 assert Float.ceil(-0.32453e-10) === 0.0 assert Float.ceil(1.32453e-10) === 1.0 + assert Float.ceil(0.0) === 0.0 end test "ceil/2 with precision" do @@ -94,6 +95,8 @@ defmodule FloatTest do assert Float.ceil(12.32453e-20, 2) === 0.01 assert Float.ceil(-12.32453e-20, 2) === 0.0 + + assert Float.ceil(0.0, 2) === 0.0 end test "round/2" do