File 2073-Add-math-floor-1-and-math-ceil-1.patch of Package erlang

From 6d40cfd77f1d2f1e1403e4b41c0b53ae6499ea11 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Mon, 27 Jun 2016 12:54:04 +0200
Subject: [PATCH 2/2] Add math:floor/1 and math:ceil/1

Add math:floor/1 and math:ceil/1 to avoid unnecessary conversions
in floating point expressions. That is, instead of having to write
float(floor(X)) as part of a floating point expressions, we can
write simply math:floor(X).
---
 erts/emulator/beam/bif.tab          |  2 +
 erts/emulator/beam/erl_math.c       | 10 +++-
 lib/compiler/src/beam_type.erl      |  2 +
 lib/compiler/src/beam_validator.erl |  2 +
 lib/compiler/src/erl_bifs.erl       |  2 +
 lib/compiler/test/float_SUITE.erl   |  5 ++
 lib/stdlib/doc/src/math.xml         |  2 +
 lib/stdlib/src/math.erl             | 13 +++++-
 lib/stdlib/test/Makefile            |  1 +
 lib/stdlib/test/math_SUITE.erl      | 92 +++++++++++++++++++++++++++++++++++++
 10 files changed, 128 insertions(+), 3 deletions(-)
 create mode 100644 lib/stdlib/test/math_SUITE.erl

diff --git a/erts/emulator/beam/bif.tab b/erts/emulator/beam/bif.tab
index 67eae35..0bd80ea 100644
--- a/erts/emulator/beam/bif.tab
+++ b/erts/emulator/beam/bif.tab
@@ -658,6 +658,8 @@ bif maps:take/2
 
 bif erlang:floor/1
 bif erlang:ceil/1
+bif math:floor/1
+bif math:ceil/1
 
 #
 # Obsolete
diff --git a/erts/emulator/beam/erl_math.c b/erts/emulator/beam/erl_math.c
index fc0aaed..990fa63 100644
--- a/erts/emulator/beam/erl_math.c
+++ b/erts/emulator/beam/erl_math.c
@@ -247,6 +247,12 @@ BIF_RETTYPE math_pow_2(BIF_ALIST_2)
     return math_call_2(BIF_P, pow, BIF_ARG_1, BIF_ARG_2);
 }
 
+BIF_RETTYPE math_ceil_1(BIF_ALIST_1)
+{
+    return math_call_1(BIF_P, ceil, BIF_ARG_1);
+}
 
-
-
+BIF_RETTYPE math_floor_1(BIF_ALIST_1)
+{
+    return math_call_1(BIF_P, floor, BIF_ARG_1);
+}
diff --git a/lib/compiler/src/beam_type.erl b/lib/compiler/src/beam_type.erl
index acaf3ed..b477629 100644
--- a/lib/compiler/src/beam_type.erl
+++ b/lib/compiler/src/beam_type.erl
@@ -592,6 +592,8 @@ is_math_bif(log10, 1) -> true;
 is_math_bif(sqrt, 1) -> true;
 is_math_bif(atan2, 2) -> true;
 is_math_bif(pow, 2) -> true;
+is_math_bif(ceil, 1) -> true;
+is_math_bif(floor, 1) -> true;
 is_math_bif(pi, 0) -> true;
 is_math_bif(_, _) -> false.
 
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl
index fd340bd..61aea57 100644
--- a/lib/compiler/src/beam_validator.erl
+++ b/lib/compiler/src/beam_validator.erl
@@ -1642,6 +1642,8 @@ return_type_math(log10, 1) -> {float,[]};
 return_type_math(sqrt, 1) -> {float,[]};
 return_type_math(atan2, 2) -> {float,[]};
 return_type_math(pow, 2) -> {float,[]};
+return_type_math(ceil, 1) -> {float,[]};
+return_type_math(floor, 1) -> {float,[]};
 return_type_math(pi, 0) -> {float,[]};
 return_type_math(F, A) when is_atom(F), is_integer(A), A >= 0 -> term.
 
diff --git a/lib/compiler/src/erl_bifs.erl b/lib/compiler/src/erl_bifs.erl
index 7240592..7693daa 100644
--- a/lib/compiler/src/erl_bifs.erl
+++ b/lib/compiler/src/erl_bifs.erl
@@ -131,11 +131,13 @@ is_pure(math, asinh, 1) -> true;
 is_pure(math, atan, 1) -> true;
 is_pure(math, atan2, 2) -> true;
 is_pure(math, atanh, 1) -> true;
+is_pure(math, ceil, 1) -> true;
 is_pure(math, cos, 1) -> true;
 is_pure(math, cosh, 1) -> true;
 is_pure(math, erf, 1) -> true;
 is_pure(math, erfc, 1) -> true;
 is_pure(math, exp, 1) -> true;
+is_pure(math, floor, 1) -> true;
 is_pure(math, log, 1) -> true;
 is_pure(math, log2, 1) -> true;
 is_pure(math, log10, 1) -> true;
diff --git a/lib/compiler/test/float_SUITE.erl b/lib/compiler/test/float_SUITE.erl
index f609594..0ebc71e 100644
--- a/lib/compiler/test/float_SUITE.erl
+++ b/lib/compiler/test/float_SUITE.erl
@@ -150,6 +150,11 @@ math_functions(Config) when is_list(Config) ->
     ?OPTIONAL(0.0, math:erf(id(0))),
     ?OPTIONAL(1.0, math:erfc(id(0))),
 
+    5.0 = math:floor(5.6),
+    6.0 = math:ceil(5.6),
+    5.0 = math:floor(id(5.4)),
+    6.0 = math:ceil(id(5.4)),
+
     %% Only for coverage (of beam_type.erl).
     {'EXIT',{undef,_}} = (catch math:fnurfla(0)),
     {'EXIT',{undef,_}} = (catch math:fnurfla(0, 0)),
diff --git a/lib/stdlib/doc/src/math.xml b/lib/stdlib/doc/src/math.xml
index 1358ce5..70ca6ae 100644
--- a/lib/stdlib/doc/src/math.xml
+++ b/lib/stdlib/doc/src/math.xml
@@ -57,9 +57,11 @@
       <name name="atan" arity="1"/>
       <name name="atan2" arity="2"/>
       <name name="atanh" arity="1"/>
+      <name name="ceil" arity="1"/>
       <name name="cos" arity="1"/>
       <name name="cosh" arity="1"/>
       <name name="exp" arity="1"/>
+      <name name="floor" arity="1"/>
       <name name="log" arity="1"/>
       <name name="log10" arity="1"/>
       <name name="log2" arity="1"/>
diff --git a/lib/stdlib/src/math.erl b/lib/stdlib/src/math.erl
index 97c965e..1db48cd 100644
--- a/lib/stdlib/src/math.erl
+++ b/lib/stdlib/src/math.erl
@@ -25,7 +25,8 @@
 
 -export([sin/1, cos/1, tan/1, asin/1, acos/1, atan/1, atan2/2, sinh/1,
          cosh/1, tanh/1, asinh/1, acosh/1, atanh/1, exp/1, log/1,
-         log2/1, log10/1, pow/2, sqrt/1, erf/1, erfc/1]).
+         log2/1, log10/1, pow/2, sqrt/1, erf/1, erfc/1,
+	 ceil/1, floor/1]).
 
 -spec acos(X) -> float() when
       X :: number().
@@ -63,6 +64,11 @@ atan2(_, _) ->
 atanh(_) ->
     erlang:nif_error(undef).
 
+-spec ceil(X) -> float() when
+      X :: number().
+ceil(_) ->
+    erlang:nif_error(undef).
+
 -spec cos(X) -> float() when
       X :: number().
 cos(_) ->
@@ -88,6 +94,11 @@ erfc(_) ->
 exp(_) ->
     erlang:nif_error(undef).
 
+-spec floor(X) -> float() when
+      X :: number().
+floor(_) ->
+    erlang:nif_error(undef).
+
 -spec log(X) -> float() when
       X :: number().
 log(_) ->
diff --git a/lib/stdlib/test/Makefile b/lib/stdlib/test/Makefile
index 28c35ae..deac04a 100644
--- a/lib/stdlib/test/Makefile
+++ b/lib/stdlib/test/Makefile
@@ -52,6 +52,7 @@ MODULES= \
 	io_proto_SUITE \
 	lists_SUITE \
 	log_mf_h_SUITE \
+	math_SUITE \
 	ms_transform_SUITE \
 	pool_SUITE \
 	proc_lib_SUITE \
diff --git a/lib/stdlib/test/math_SUITE.erl b/lib/stdlib/test/math_SUITE.erl
new file mode 100644
index 0000000..2b29e44
--- /dev/null
+++ b/lib/stdlib/test/math_SUITE.erl
@@ -0,0 +1,92 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2016. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%%     http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(math_SUITE).
+
+-include_lib("common_test/include/ct.hrl").
+
+%% Test server specific exports
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+	 init_per_group/2,end_per_group/2,
+	 init_per_testcase/2, end_per_testcase/2]).
+
+%% Test cases
+-export([floor_ceil/1]).
+
+
+suite() ->
+    [{ct_hooks,[ts_install_cth]},
+     {timetrap,{minutes,1}}].
+
+all() ->
+    [floor_ceil].
+
+groups() ->
+    [].
+
+init_per_suite(Config) ->
+    Config.
+
+end_per_suite(_Config) ->
+    ok.
+
+init_per_group(_GroupName, Config) ->
+    Config.
+
+end_per_group(_GroupName, Config) ->
+    Config.
+
+
+init_per_testcase(_Case, Config) ->
+    Config.
+
+end_per_testcase(_Case, _Config) ->
+    ok.
+
+floor_ceil(_Config) ->
+    MinusZero = 0.0/(-1.0),
+    -43.0 = do_floor_ceil(-42.1),
+    -43.0 = do_floor_ceil(-42.7),
+    0.0 = do_floor_ceil(MinusZero),
+    10.0 = do_floor_ceil(10.1),
+    10.0 = do_floor_ceil(10.9),
+
+    -533.0 = do_floor_ceil(-533.0),
+    453555.0 = do_floor_ceil(453555.0),
+
+    -58.0 = do_floor_ceil(-58),
+    777.0 = do_floor_ceil(777),
+
+    ok.
+
+do_floor_ceil(Val) ->
+    Floor = math:floor(Val),
+    Ceil = math:ceil(Val),
+
+    true = is_float(Floor),
+    true = is_float(Ceil),
+
+    if
+	Floor =:= Ceil ->
+	    Floor;
+	true ->
+	    1.0 = Ceil - Floor,
+	    Floor
+    end.
-- 
2.10.0

openSUSE Build Service is sponsored by