aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/test/float_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compiler/test/float_SUITE.erl')
-rw-r--r--lib/compiler/test/float_SUITE.erl120
1 files changed, 120 insertions, 0 deletions
diff --git a/lib/compiler/test/float_SUITE.erl b/lib/compiler/test/float_SUITE.erl
new file mode 100644
index 0000000000..3d2dbf47e9
--- /dev/null
+++ b/lib/compiler/test/float_SUITE.erl
@@ -0,0 +1,120 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(float_SUITE).
+-export([all/1,pending/1,bif_calls/1,math_functions/1,mixed_float_and_int/1]).
+
+-include("test_server.hrl").
+
+all(suite) ->
+ test_lib:recompile(?MODULE),
+ [pending,bif_calls,math_functions,mixed_float_and_int].
+
+%% Thanks to Tobias Lindahl <[email protected]>
+%% Shows the effect of pending exceptions on the x86.
+
+pending(Config) when is_list(Config) ->
+ ?line case catch float_mul(1, 1.1e300, 3.14e300) of
+ {'EXIT',{badarith,_}} -> ok;
+ Other -> ?t:fail({expected_exception,Other})
+ end,
+ ?line 0.0 = float_sub(2.0).
+
+float_sub(A)->
+ catch A - 2.0.
+
+float_mul(0, _, _)->
+ ok;
+float_mul(Iter, A, B) when is_float(A), is_float(B) ->
+ A*B,
+ float_mul(Iter-1, A, B).
+
+%% Thanks to Mikael Pettersson and Tobias Lindahl (HiPE).
+
+bif_calls(Config) when is_list(Config) ->
+ ?line {'EXIT',{badarith,_}} = (catch bad_arith(2.0, 1.7)),
+ ?line {'EXIT',{badarith,_}} = (catch bad_arith_again(2.0, [])),
+ ?line {'EXIT',{badarith,_}} = (catch bad_arith_xor(2.0, [])),
+ ?line {'EXIT',{badarith,_}} = (catch bad_arith_hd(2.0, [])),
+ ?line {'EXIT',{badarith,_}} = (catch bad_negate(2.0, 1.7)),
+ ok.
+
+bad_arith(X, Y) when is_float(X) ->
+ X1 = X * 1.7e+308,
+ X2 = X1 + 1.0,
+ Y1 = Y * 2, %Calls erts_mixed_times/2.
+ %(A BIF call.)
+ {X2, Y1}.
+
+bad_arith_xor(X, Y) when is_float(X) ->
+ X1 = X * 1.7e+308,
+ Y1 = Y xor true, %A failing BIF call.
+ {X1 + 1.0, Y1}.
+
+bad_arith_hd(X, Y) when is_float(X) ->
+ X1 = X * 1.7e+308,
+ Y1 = hd(Y), %A failing BIF call.
+ {X1 + 1.0, Y1}.
+
+bad_arith_again(X, Y) when is_float(X) ->
+ X1 = X * 1.7e+308,
+ Y1 = element(1, Y), %A failing BIF call.
+ {X1 + 1.0, Y1}.
+
+bad_negate(X, Y) when is_float(X) ->
+ X1 = X * 1.7e+308,
+ X2 = X1 + 1.0,
+ Y1 = -Y, %BIF call.
+ {X2, Y1}.
+
+math_functions(Config) when is_list(Config) ->
+ %% Mostly silly coverage.
+ ?line 0.0 = math:tan(0),
+ ?line 0.0 = math:atan2(0, 1),
+ ?line 0.0 = math:sinh(0),
+ ?line 1.0 = math:cosh(0),
+ ?line 0.0 = math:tanh(0),
+ ?line 1.0 = math:log10(10),
+ ?line -1.0 = math:cos(math:pi()),
+ ?line 1.0 = math:exp(0),
+ ?line 1.0 = math:pow(math:pi(), 0),
+
+ ?line 0.0 = math:tan(id(0)),
+ ?line 0.0 = math:atan2(id(0), 1),
+ ?line 0.0 = math:sinh(id(0)),
+ ?line 1.0 = math:cosh(id(0)),
+ ?line 0.0 = math:tanh(id(0)),
+ ?line 1.0 = math:log10(id(10)),
+ ?line 1.0 = math:exp(id(0)),
+
+ %% Only for coverage (of beam_type.erl).
+ ?line {'EXIT',{undef,_}} = (catch math:fnurfla(0)),
+ ?line {'EXIT',{undef,_}} = (catch math:fnurfla(0, 0)),
+ ?line {'EXIT',{badarg,_}} = (catch float(kalle)),
+ ?line {'EXIT',{badarith,_}} = (catch name/1),
+ ok.
+
+mixed_float_and_int(Config) when is_list(Config) ->
+ ?line 129.0 = pc(77, 23, 5),
+ ok.
+
+pc(Cov, NotCov, X) ->
+ round(Cov/(Cov+NotCov)*100) + 42 + 2.0*X.
+
+id(I) -> I.
+