mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-14 05:12:33 +00:00
Document how "next integer" operations handle infinite values.
Fix a test case failure in spf grades.
library/math.m:
Document how the "next integer" operations handle arguments of infinite
magnitude.
tests/general/float_test.m:
s/ceil/ceiling/ in a spot.
Test next integer operations with +/-infinity (and zero).
In the erlang grades, avoid running parts of these tests that
rely on library functionality that is NYI.
Document what the expected outputs correspond to.
tests/general/float_test.exp:
Update this expected output.
tests/general/float_test.exp2:
Replace the contents of this file: previously it contained output for
some ancient version of MSVC; it now contains the spf version of the
output.
tests/general/float_test.exp3:
A new expected output for the erlang grades.
This commit is contained in:
@@ -56,21 +56,25 @@
|
|||||||
|
|
||||||
% ceiling(X) = Ceil is true if Ceil is the smallest integer
|
% ceiling(X) = Ceil is true if Ceil is the smallest integer
|
||||||
% not less than X.
|
% not less than X.
|
||||||
|
% If X is of infinite magnitude then Ceil = X.
|
||||||
%
|
%
|
||||||
:- func ceiling(float) = float.
|
:- func ceiling(float) = float.
|
||||||
|
|
||||||
% floor(X) = Floor is true if Floor is the largest integer
|
% floor(X) = Floor is true if Floor is the largest integer
|
||||||
% not greater than X.
|
% not greater than X.
|
||||||
|
% If X is of infinite magnitude then Floor = X.
|
||||||
%
|
%
|
||||||
:- func floor(float) = float.
|
:- func floor(float) = float.
|
||||||
|
|
||||||
% round(X) = Round is true if Round is the integer closest to X.
|
% round(X) = Round is true if Round is the integer closest to X.
|
||||||
% If X has a fractional value of 0.5, it is rounded up.
|
% If X has a fractional value of 0.5, it is rounded up.
|
||||||
|
% If X is of infinite magnitude then Round = X.
|
||||||
%
|
%
|
||||||
:- func round(float) = float.
|
:- func round(float) = float.
|
||||||
|
|
||||||
% truncate(X) = Trunc is true if Trunc is the integer closest to X
|
% truncate(X) = Trunc is true if Trunc is the integer closest to X
|
||||||
% such that |Trunc| =< |X|.
|
% such that |Trunc| =< |X|.
|
||||||
|
% If X is of infinite magnitude then Trunc = X.
|
||||||
%
|
%
|
||||||
:- func truncate(float) = float.
|
:- func truncate(float) = float.
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ X * Y: 12
|
|||||||
X - Y: -1
|
X - Y: -1
|
||||||
X / Y: 0.75
|
X / Y: 0.75
|
||||||
X ^ Y: 81
|
X ^ Y: 81
|
||||||
|
|
||||||
X: 41
|
X: 41
|
||||||
Y: -3
|
Y: -3
|
||||||
X + Y: 38
|
X + Y: 38
|
||||||
@@ -13,21 +14,44 @@ X * Y: -123
|
|||||||
X - Y: 44
|
X - Y: 44
|
||||||
X / Y: -13.7
|
X / Y: -13.7
|
||||||
X ^ Y: 1.45e-05
|
X ^ Y: 1.45e-05
|
||||||
|
|
||||||
Float max: 1.8e+308
|
Float max: 1.8e+308
|
||||||
Float min: 2.23e-308
|
Float min: 2.23e-308
|
||||||
Float epsilon: 2.22e-16
|
Float epsilon: 2.22e-16
|
||||||
|
|
||||||
Pi: 3.14
|
Pi: 3.14
|
||||||
e: 2.72
|
e: 2.72
|
||||||
|
|
||||||
|
X: 0
|
||||||
|
ceiling(X): 0
|
||||||
|
floor(X): 0
|
||||||
|
round(X): 0
|
||||||
|
truncate(X): 0
|
||||||
|
|
||||||
X: 2.7
|
X: 2.7
|
||||||
ceil(X): 3
|
ceiling(X): 3
|
||||||
floor(X): 2
|
floor(X): 2
|
||||||
round(X): 3
|
round(X): 3
|
||||||
truncate(X): 2
|
truncate(X): 2
|
||||||
|
|
||||||
X: -3.6
|
X: -3.6
|
||||||
ceil(X): -3
|
ceiling(X): -3
|
||||||
floor(X): -4
|
floor(X): -4
|
||||||
round(X): -4
|
round(X): -4
|
||||||
truncate(X): -3
|
truncate(X): -3
|
||||||
|
|
||||||
|
X: infinity
|
||||||
|
ceiling(X): infinity
|
||||||
|
floor(X): infinity
|
||||||
|
round(X): infinity
|
||||||
|
truncate(X): infinity
|
||||||
|
|
||||||
|
X: -infinity
|
||||||
|
ceiling(X): -infinity
|
||||||
|
floor(X): -infinity
|
||||||
|
round(X): -infinity
|
||||||
|
truncate(X): -infinity
|
||||||
|
|
||||||
X: 2.2
|
X: 2.2
|
||||||
sqrt(X): 1.48
|
sqrt(X): 1.48
|
||||||
ln(X): 0.788
|
ln(X): 0.788
|
||||||
@@ -35,6 +59,7 @@ log2(X): 1.14
|
|||||||
log10(X): 0.342
|
log10(X): 0.342
|
||||||
log(2.1, X): 1.06
|
log(2.1, X): 1.06
|
||||||
exp(X): 9.03
|
exp(X): 9.03
|
||||||
|
|
||||||
X: 0.5
|
X: 0.5
|
||||||
sin(X): 0.479
|
sin(X): 0.479
|
||||||
cos(X): 0.878
|
cos(X): 0.878
|
||||||
@@ -43,7 +68,9 @@ sinh(X): 0.521
|
|||||||
cosh(X): 1.13
|
cosh(X): 1.13
|
||||||
tanh(X): 0.462
|
tanh(X): 0.462
|
||||||
atan2(sin(X), cos(X)): 0.5
|
atan2(sin(X), cos(X)): 0.5
|
||||||
|
|
||||||
X: 0.6
|
X: 0.6
|
||||||
asin(X): 0.644
|
asin(X): 0.644
|
||||||
acos(X): 0.927
|
acos(X): 0.927
|
||||||
atan(X): 0.54
|
atan(X): 0.54
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,76 @@
|
|||||||
1234.5678: 1.23e+003
|
1234.5678: 1.23e+03
|
||||||
X: 3
|
X: 3
|
||||||
Y: 4
|
Y: 4
|
||||||
X + Y: 7
|
X + Y: 7
|
||||||
X * Y: 12
|
X * Y: 12
|
||||||
X - Y: -1
|
X - Y: -1
|
||||||
X / Y: 0.75
|
X / Y: 0.75
|
||||||
|
X ^ Y: 81
|
||||||
|
|
||||||
X: 41
|
X: 41
|
||||||
Y: -3
|
Y: -3
|
||||||
X + Y: 38
|
X + Y: 38
|
||||||
X * Y: -123
|
X * Y: -123
|
||||||
X - Y: 44
|
X - Y: 44
|
||||||
X / Y: -13.7
|
X / Y: -13.7
|
||||||
Float max: 1.8e+308
|
X ^ Y: 1.45e-05
|
||||||
Float min: 2.23e-308
|
|
||||||
Float epsilon: 2.22e-016
|
Float max: 3.4e+38
|
||||||
|
Float min: 1.18e-38
|
||||||
|
Float epsilon: 1.19e-07
|
||||||
|
|
||||||
|
Pi: 3.14
|
||||||
|
e: 2.72
|
||||||
|
|
||||||
|
X: 0
|
||||||
|
ceiling(X): 0
|
||||||
|
floor(X): 0
|
||||||
|
round(X): 0
|
||||||
|
truncate(X): 0
|
||||||
|
|
||||||
|
X: 2.7
|
||||||
|
ceiling(X): 3
|
||||||
|
floor(X): 2
|
||||||
|
round(X): 3
|
||||||
|
truncate(X): 2
|
||||||
|
|
||||||
|
X: -3.6
|
||||||
|
ceiling(X): -3
|
||||||
|
floor(X): -4
|
||||||
|
round(X): -4
|
||||||
|
truncate(X): -3
|
||||||
|
|
||||||
|
X: infinity
|
||||||
|
ceiling(X): infinity
|
||||||
|
floor(X): infinity
|
||||||
|
round(X): infinity
|
||||||
|
truncate(X): infinity
|
||||||
|
|
||||||
|
X: -infinity
|
||||||
|
ceiling(X): -infinity
|
||||||
|
floor(X): -infinity
|
||||||
|
round(X): -infinity
|
||||||
|
truncate(X): -infinity
|
||||||
|
|
||||||
|
X: 2.2
|
||||||
|
sqrt(X): 1.48
|
||||||
|
ln(X): 0.788
|
||||||
|
log2(X): 1.14
|
||||||
|
log10(X): 0.342
|
||||||
|
log(2.1, X): 1.06
|
||||||
|
exp(X): 9.03
|
||||||
|
|
||||||
|
X: 0.5
|
||||||
|
sin(X): 0.479
|
||||||
|
cos(X): 0.878
|
||||||
|
tan(X): 0.546
|
||||||
|
sinh(X): 0.521
|
||||||
|
cosh(X): 1.13
|
||||||
|
tanh(X): 0.462
|
||||||
|
atan2(sin(X), cos(X)): 0.5
|
||||||
|
|
||||||
|
X: 0.6
|
||||||
|
asin(X): 0.644
|
||||||
|
acos(X): 0.927
|
||||||
|
atan(X): 0.54
|
||||||
|
|
||||||
|
|||||||
64
tests/general/float_test.exp3
Normal file
64
tests/general/float_test.exp3
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
1234.5678: 1.23e+03
|
||||||
|
X: 3
|
||||||
|
Y: 4
|
||||||
|
X + Y: 7
|
||||||
|
X * Y: 12
|
||||||
|
X - Y: -1
|
||||||
|
X / Y: 0.75
|
||||||
|
X ^ Y: 81
|
||||||
|
|
||||||
|
X: 41
|
||||||
|
Y: -3
|
||||||
|
X + Y: 38
|
||||||
|
X * Y: -123
|
||||||
|
X - Y: 44
|
||||||
|
X / Y: -13.7
|
||||||
|
X ^ Y: 1.45e-05
|
||||||
|
|
||||||
|
Float max: 1.8e+308
|
||||||
|
Float min: 2.23e-308
|
||||||
|
Float epsilon: 2.22e-16
|
||||||
|
|
||||||
|
Pi: 3.14
|
||||||
|
e: 2.72
|
||||||
|
|
||||||
|
X: 0
|
||||||
|
ceiling(X): 0
|
||||||
|
floor(X): 0
|
||||||
|
round(X): 0
|
||||||
|
truncate(X): 0
|
||||||
|
|
||||||
|
X: 2.7
|
||||||
|
ceiling(X): 3
|
||||||
|
floor(X): 2
|
||||||
|
round(X): 3
|
||||||
|
truncate(X): 2
|
||||||
|
|
||||||
|
X: -3.6
|
||||||
|
ceiling(X): -3
|
||||||
|
floor(X): -4
|
||||||
|
round(X): -4
|
||||||
|
truncate(X): -3
|
||||||
|
|
||||||
|
X: 2.2
|
||||||
|
sqrt(X): 1.48
|
||||||
|
ln(X): 0.788
|
||||||
|
log2(X): 1.14
|
||||||
|
log10(X): 0.342
|
||||||
|
log(2.1, X): 1.06
|
||||||
|
exp(X): 9.03
|
||||||
|
|
||||||
|
X: 0.5
|
||||||
|
sin(X): 0.479
|
||||||
|
cos(X): 0.878
|
||||||
|
tan(X): 0.546
|
||||||
|
sinh(X): 0.521
|
||||||
|
cosh(X): 1.13
|
||||||
|
tanh(X): 0.462
|
||||||
|
atan2(sin(X), cos(X)): 0.5
|
||||||
|
|
||||||
|
X: 0.6
|
||||||
|
asin(X): 0.644
|
||||||
|
acos(X): 0.927
|
||||||
|
atan(X): 0.54
|
||||||
|
|
||||||
@@ -5,6 +5,10 @@
|
|||||||
% A very basic check of floating point arithmetic and string.to_float.
|
% A very basic check of floating point arithmetic and string.to_float.
|
||||||
% Now tests maths library stuff too.
|
% Now tests maths library stuff too.
|
||||||
%
|
%
|
||||||
|
% The .exp file is for grades that use double-precision floats.
|
||||||
|
% The .exp2 file is for grades that use single-precision floats.
|
||||||
|
% The .exp3 file is for the erlang grades (see below).
|
||||||
|
%
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
|
|
||||||
:- module float_test.
|
:- module float_test.
|
||||||
@@ -36,8 +40,16 @@ main(!IO) :-
|
|||||||
test_arithmetic(41.0, -3.0, !IO),
|
test_arithmetic(41.0, -3.0, !IO),
|
||||||
test_constants(!IO),
|
test_constants(!IO),
|
||||||
test_math_constants(!IO),
|
test_math_constants(!IO),
|
||||||
|
test_rounding(0.0, !IO),
|
||||||
test_rounding(2.7, !IO),
|
test_rounding(2.7, !IO),
|
||||||
test_rounding(-3.6, !IO),
|
test_rounding(-3.6, !IO),
|
||||||
|
( if have_erlang_grade then
|
||||||
|
true
|
||||||
|
else
|
||||||
|
% float.infinity is NYI for Erlang.
|
||||||
|
test_rounding(float.infinity, !IO),
|
||||||
|
test_rounding(-float.infinity, !IO)
|
||||||
|
),
|
||||||
test_power(2.2, !IO),
|
test_power(2.2, !IO),
|
||||||
test_trig(0.5, !IO),
|
test_trig(0.5, !IO),
|
||||||
test_inv_trig(0.6, !IO).
|
test_inv_trig(0.6, !IO).
|
||||||
@@ -63,7 +75,8 @@ test_arithmetic(X, Y, !IO) :-
|
|||||||
write_message("X * Y: ", Times, !IO),
|
write_message("X * Y: ", Times, !IO),
|
||||||
write_message("X - Y: ", Minus, !IO),
|
write_message("X - Y: ", Minus, !IO),
|
||||||
write_message("X / Y: ", Divide, !IO),
|
write_message("X / Y: ", Divide, !IO),
|
||||||
write_message("X ^ Y: ", Pow, !IO).
|
write_message("X ^ Y: ", Pow, !IO),
|
||||||
|
io.nl(!IO).
|
||||||
|
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
|
|
||||||
@@ -72,7 +85,8 @@ test_arithmetic(X, Y, !IO) :-
|
|||||||
test_constants(!IO) :-
|
test_constants(!IO) :-
|
||||||
write_message("Float max: ", float.max, !IO),
|
write_message("Float max: ", float.max, !IO),
|
||||||
write_message("Float min: ", float.min, !IO),
|
write_message("Float min: ", float.min, !IO),
|
||||||
write_message("Float epsilon: ", float.epsilon, !IO).
|
write_message("Float epsilon: ", float.epsilon, !IO),
|
||||||
|
io.nl(!IO).
|
||||||
|
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
|
|
||||||
@@ -80,7 +94,8 @@ test_constants(!IO) :-
|
|||||||
|
|
||||||
test_math_constants(!IO) :-
|
test_math_constants(!IO) :-
|
||||||
write_message("Pi: ", math.pi, !IO),
|
write_message("Pi: ", math.pi, !IO),
|
||||||
write_message("e: ", math.e, !IO).
|
write_message("e: ", math.e, !IO),
|
||||||
|
io.nl(!IO).
|
||||||
|
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
|
|
||||||
@@ -88,10 +103,11 @@ test_math_constants(!IO) :-
|
|||||||
|
|
||||||
test_rounding(X, !IO) :-
|
test_rounding(X, !IO) :-
|
||||||
write_message("X: ", X, !IO),
|
write_message("X: ", X, !IO),
|
||||||
write_message("ceil(X): ", math.ceiling(X), !IO),
|
write_message("ceiling(X): ", math.ceiling(X), !IO),
|
||||||
write_message("floor(X): ", math.floor(X), !IO),
|
write_message("floor(X): ", math.floor(X), !IO),
|
||||||
write_message("round(X): ", math.round(X), !IO),
|
write_message("round(X): ", math.round(X), !IO),
|
||||||
write_message("truncate(X): ", math.truncate(X), !IO).
|
write_message("truncate(X): ", math.truncate(X), !IO),
|
||||||
|
io.nl(!IO).
|
||||||
|
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
|
|
||||||
@@ -104,7 +120,8 @@ test_power(X, !IO) :-
|
|||||||
write_message("log2(X): ", math.log2(X), !IO),
|
write_message("log2(X): ", math.log2(X), !IO),
|
||||||
write_message("log10(X): ", math.log10(X), !IO),
|
write_message("log10(X): ", math.log10(X), !IO),
|
||||||
write_message("log(2.1, X): ", math.log(2.1, X), !IO),
|
write_message("log(2.1, X): ", math.log(2.1, X), !IO),
|
||||||
write_message("exp(X): ", math.exp(X), !IO).
|
write_message("exp(X): ", math.exp(X), !IO),
|
||||||
|
io.nl(!IO).
|
||||||
|
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
|
|
||||||
@@ -119,7 +136,8 @@ test_trig(X, !IO) :-
|
|||||||
write_message("cosh(X): ", math.cosh(X), !IO),
|
write_message("cosh(X): ", math.cosh(X), !IO),
|
||||||
write_message("tanh(X): ", math.tanh(X), !IO),
|
write_message("tanh(X): ", math.tanh(X), !IO),
|
||||||
write_message("atan2(sin(X), cos(X)): ",
|
write_message("atan2(sin(X), cos(X)): ",
|
||||||
math.atan2(math.sin(X), math.cos(X)), !IO).
|
math.atan2(math.sin(X), math.cos(X)), !IO),
|
||||||
|
io.nl(!IO).
|
||||||
|
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
|
|
||||||
@@ -129,7 +147,22 @@ test_inv_trig(X, !IO) :-
|
|||||||
write_message("X: ", X, !IO),
|
write_message("X: ", X, !IO),
|
||||||
write_message("asin(X): ", math.asin(X), !IO),
|
write_message("asin(X): ", math.asin(X), !IO),
|
||||||
write_message("acos(X): ", math.acos(X), !IO),
|
write_message("acos(X): ", math.acos(X), !IO),
|
||||||
write_message("atan(X): ", math.atan(X), !IO).
|
write_message("atan(X): ", math.atan(X), !IO),
|
||||||
|
io.nl(!IO).
|
||||||
|
|
||||||
|
%---------------------------------------------------------------------------%
|
||||||
|
|
||||||
|
:- pred have_erlang_grade is semidet.
|
||||||
|
|
||||||
|
:- pragma foreign_proc("Erlang",
|
||||||
|
have_erlang_grade,
|
||||||
|
[will_not_call_mercury, promise_pure, thread_safe],
|
||||||
|
"
|
||||||
|
SUCCESS_INDICATOR = true
|
||||||
|
").
|
||||||
|
|
||||||
|
have_erlang_grade :-
|
||||||
|
semidet_false.
|
||||||
|
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
%---------------------------------------------------------------------------%
|
%---------------------------------------------------------------------------%
|
||||||
|
|||||||
Reference in New Issue
Block a user