for review: obsolete predicates in float.m

Simon Taylor stayl at cs.mu.OZ.AU
Mon Mar 15 10:25:53 AEDT 1999


Estimated hours taken: 0.5

library/float.m:
	Uncomment some `:- pragma obsolete' declarations, since the
	bug that caused them to be commented out was fixed years ago.

	Add `:- pragma obsolete' declarations for some predicate versions
	of functions, and move them out of the Library Reference Manual.

	Define obselete predicates in terms of non-obsolete functions
	rather than the other way around.

	Add `uo' modes for the floating point system constant functions.

NEWS:
	Document the obsolete predicates.



Index: NEWS
===================================================================
RCS file: /home/staff/zs/imp/mercury/NEWS,v
retrieving revision 1.133
diff -u -u -r1.133 NEWS
--- NEWS	1999/03/07 14:02:28	1.133
+++ NEWS	1999/03/14 23:20:20
@@ -2,7 +2,26 @@
 -------------------------------
 
 * We've added a new predicate to the Mercury standard library:
-	bag__count_value/3.	
+	bag__count_value/3.
+
+  The following predicates are now obsolete, and will be
+  removed in a future release:
+	float__ceiling_to_int/2,
+	float__floor_to_int/2,
+	float__round_to_int/2,
+	float__truncate_to_int/2,
+	float__abs/2,
+	float__max/3,
+	float__min/3,
+	float__pow/3,
+	float__hash/2,
+	float__max/1,
+	float__min/1,
+	float__epsilon/1,
+	float__radix/1,
+	float__mantissa_digits/1,
+	float__min_exponent/1,
+	float__max_exponent/1.
 
 * The extras distribution now includes support for dynamic linking.
 
Index: library/float.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/float.m,v
retrieving revision 1.28
diff -u -u -r1.28 float.m
--- float.m	1998/09/09 02:35:17	1.28
+++ float.m	1999/03/12 04:32:05
@@ -155,12 +155,14 @@
 	% max = (1 - radix ** mantissa_digits) * radix ** max_exponent
 	%
 :- func float__max = float.
+:- mode float__max = uo is det.
 
 	% Minimum normalised floating-point number
 	%
 	% min = radix ** (min_exponent - 1)
 	%
 :- func float__min = float.
+:- mode float__min = uo is det.
 
 	% Smallest number x such that 1.0 + x \= 1.0
 	% This represents the largest relative spacing of two
@@ -168,16 +170,19 @@
 	%
 	% epsilon = radix ** (1 - mantissa_digits)
 :- func float__epsilon = float.
+:- mode float__epsilon = uo is det.
 
 	% Radix of the floating-point representation.
 	% In the literature, this is sometimes referred to as `b'.
 	%
 :- func float__radix = int.
+:- mode float__radix = uo is det.
 
 	% The number of base-radix digits in the mantissa.  In the
 	% literature, this is sometimes referred to as `p' or `t'.
 	%
 :- func float__mantissa_digits = int.
+:- mode float__mantissa_digits = uo is det.
 
 	% Minimum negative integer such that:
 	%	radix ** (min_exponent - 1)
@@ -185,6 +190,7 @@
 	% this is sometimes referred to as `e_min'.
 	%
 :- func float__min_exponent = int.
+:- mode float__min_exponent = uo is det.
 
 	% Maximum integer such that:
 	%	radix ** (max_exponent - 1)
@@ -192,13 +198,26 @@
 	% this is sometimes referred to as `e_max'.
 	%
 :- func float__max_exponent = int.
+:- mode float__max_exponent = uo is det.
 
 %---------------------------------------------------------------------------%
+%---------------------------------------------------------------------------%
+
+:- implementation.
+:- interface.
 
-% Predicate versions of the functions declared above.
-% These are intended for use in programs that need to work
+	% Everything below here will not appear in the
+	% Mercury Library Reference Manual.
+
+%---------------------------------------------------------------------------%
+
+/* The following predicates are obsolete.  Don't use them.
+   They will eventually disappear in some future release.
+*/
+
+% Obsolete predicate versions of the functions declared above.
+% These were intended for use in programs that need to work
 % in both Prolog and Mercury (e.g. for debugging).
-% These predicate versions will eventually become obsolete.
 
 %
 % Conversion predicates
@@ -206,22 +225,26 @@
 
 	% float__ceiling_to_int(X, Ceil) is true if Ceil is the
 	% smallest integer not less than X.
+:- pragma obsolete(float__ceiling_to_int/2).
 :- pred float__ceiling_to_int(float, int).
 :- mode float__ceiling_to_int(in, out) is det.
 
 	% float__floor_to_int(X, Ceil) is true if Ceil is the
 	% largest integer not greater than X.
+:- pragma obsolete(float__floor_to_int/2).
 :- pred float__floor_to_int(float, int).
 :- mode float__floor_to_int(in, out) is det.
 
 	% float__round_to_int(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.
+:- pragma obsolete(float__round_to_int/2).
 :- pred float__round_to_int(float, int).
 :- mode float__round_to_int(in, out) is det.
 
 	% float__truncate_to_int(X, Trunc) is true if Trunc is
 	% the integer closest to X such that |Trunc| =< |X|.
+:- pragma obsolete(float__truncate_to_int/2).
 :- pred float__truncate_to_int(float, int).
 :- mode float__truncate_to_int(in, out) is det.
 
@@ -230,14 +253,17 @@
 %
 
 	% absolute value
+:- pragma obsolete(float__abs/2).
 :- pred float__abs(float, float).
 :- mode float__abs(in, out) is det.
 
 	% maximum
+:- pragma obsolete(float__max/3).
 :- pred float__max(float, float, float).
 :- mode float__max(in, in, out) is det.
 
 	% minimum
+:- pragma obsolete(float__min/3).
 :- pred float__min(float, float, float).
 :- mode float__min(in, in, out) is det.
 
@@ -245,6 +271,7 @@
 	% Base raised to the power Exponent.  The exponent must be an 
 	% integer greater or equal to 0.  Currently this function runs
 	% at O(n), where n is the value of the exponent.
+:- pragma obsolete(float__pow/3).
 :- pred float__pow(float, int, float).
 :- mode float__pow(in, in, out) is det.
 
@@ -252,6 +279,7 @@
 	% (Note: the hash values computed by the Mercury implementation of
 	% this predicate are different to those computed by the Prolog
 	% implementation.)
+:- pragma obsolete(float__hash/2).
 :- pred float__hash(float, int).
 :- mode float__hash(in, out) is det.
 
@@ -260,77 +288,73 @@
 %
 
 	% Maximum floating-point number
+:- pragma obsolete(float__max/1).
 :- pred float__max(float).
 :- mode float__max(out) is det.
 
 	% Minimum normalised floating-point number
+:- pragma obsolete(float__min/1).
 :- pred float__min(float).
 :- mode float__min(out) is det.
 
 	% Smallest number x such that 1.0 + x \= 1.0
+:- pragma obsolete(float__epsilon/1).
 :- pred float__epsilon(float).
 :- mode float__epsilon(out) is det.
 
 	% Radix of the floating-point representation.
+:- pragma obsolete(float__radix/1).
 :- pred float__radix(int).
 :- mode float__radix(out) is det.
 
 	% The number of base-radix digits in the mantissa.
+:- pragma obsolete(float__mantissa_digits/1).
 :- pred float__mantissa_digits(int).
 :- mode float__mantissa_digits(out) is det.
 
 	% Smallest exponent of a normalised floating-point number.
+:- pragma obsolete(float__min_exponent/1).
 :- pred float__min_exponent(int).
 :- mode float__min_exponent(out) is det.
 
 	% Largest exponent of a normalised floating-point number.
+:- pragma obsolete(float__max_exponent/1).
 :- pred float__max_exponent(int).
 :- mode float__max_exponent(out) is det.
 
-%---------------------------------------------------------------------------%
-%---------------------------------------------------------------------------%
-
-:- implementation.
-:- interface.
-
-	% Everything below here will not appear in the
-	% Mercury Library Reference Manual.
-
-%---------------------------------------------------------------------------%
-
-/* The following predicates are obsolete.  Don't use them.
-   They will eventually disappear in some future release.
-*/
+%
+% Synonyms for the builtin arithmetic functions.
+%
 
-% :- pragma obsolete(builtin_float_plus/3).
+:- pragma obsolete(builtin_float_plus/3).
 :- pred builtin_float_plus(float, float, float).
 :- mode builtin_float_plus(in, in, uo) is det.
 
-% :- pragma obsolete(builtin_float_minus/3).
+:- pragma obsolete(builtin_float_minus/3).
 :- pred builtin_float_minus(float, float, float).
 :- mode builtin_float_minus(in, in, uo) is det.
 
-% :- pragma obsolete(builtin_float_times/3).
+:- pragma obsolete(builtin_float_times/3).
 :- pred builtin_float_times(float, float, float).
 :- mode builtin_float_times(in, in, uo) is det.
 
-% :- pragma obsolete(builtin_float_divide/3).
+:- pragma obsolete(builtin_float_divide/3).
 :- pred builtin_float_divide(float, float, float).
 :- mode builtin_float_divide(in, in, uo) is det.
 
-% :- pragma obsolete(builtin_float_gt/2).
+:- pragma obsolete(builtin_float_gt/2).
 :- pred builtin_float_gt(float, float).
 :- mode builtin_float_gt(in, in) is semidet.
 
-% :- pragma obsolete(builtin_float_lt/2).
+:- pragma obsolete(builtin_float_lt/2).
 :- pred builtin_float_lt(float, float).
 :- mode builtin_float_lt(in, in) is semidet.
 
-% :- pragma obsolete(builtin_float_ge/2).
+:- pragma obsolete(builtin_float_ge/2).
 :- pred builtin_float_ge(float, float).
 :- mode builtin_float_ge(in, in) is semidet.
 
-% :- pragma obsolete(builtin_float_le/2).
+:- pragma obsolete(builtin_float_le/2).
 :- pred builtin_float_le(float, float).
 :- mode builtin_float_le(in, in) is semidet.
 
@@ -364,53 +388,53 @@
 float(Int) = Float :-
 	int__to_float(Int, Float).
 
-	% float__ceiling_to_int(X, Ceil) is true if Ceil is the
+	% float__ceiling_to_int(X) returns the
 	% smallest integer not less than X.
-:- pragma c_code(float__ceiling_to_int(X :: in, Ceil :: out),
+:- pragma c_code(float__ceiling_to_int(X :: in) = (Ceil :: out),
 	[will_not_call_mercury, thread_safe],
 "
 	Ceil = (Integer) ceil(X);
 ").
 
-float__ceiling_to_int(X) = Ceil :- float__ceiling_to_int(X, Ceil).
+float__ceiling_to_int(X, float__ceiling_to_int(X)).
 
 	% float__floor_to_int(X, Floor) is true if Floor is the
 	% largest integer not greater than X.
-:- pragma c_code(float__floor_to_int(X :: in, Floor :: out),
+:- pragma c_code(float__floor_to_int(X :: in) = (Floor :: out),
 	[will_not_call_mercury, thread_safe],
 "
 	Floor = (Integer) floor(X);
 ").
 
-float__floor_to_int(X) = Floor :- float__floor_to_int(X, Floor).
+float__floor_to_int(X, float__floor_to_int(X)).
 
 	% float__round_to_int(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.
-:- pragma c_code(float__round_to_int(X :: in, Round :: out),
+:- pragma c_code(float__round_to_int(X :: in) = (Round :: out),
 	[will_not_call_mercury, thread_safe],
 "
 	Round = (Integer) floor(X + 0.5);
 ").
 
-float__round_to_int(X) = Round :- float__round_to_int(X, Round).
+float__round_to_int(X, float__round_to_int(X)).
 
 	% float__truncate_to_int(X, Trunc) is true if Trunc is
 	% the integer closest to X such that |Trunc| =< |X|.
-:- pragma c_code(float__truncate_to_int(X :: in, Trunc :: out),
+:- pragma c_code(float__truncate_to_int(X :: in) = (Trunc :: out),
 	[will_not_call_mercury, thread_safe],
 "
 	Trunc = (Integer) X;
 ").
 
-float__truncate_to_int(X) = Trunc :- float__truncate_to_int(X, Trunc).
+float__truncate_to_int(X, float__truncate_to_int(X)).
 
 %---------------------------------------------------------------------------%
 %
 % Miscellaneous functions
 %
 
-float__abs(Num, Abs) :-
+float__abs(Num) = Abs :-
 	(
 		Num =< 0.0
 	->
@@ -419,9 +443,9 @@
 		Abs = Num
 	).
 
-float__abs(Num) = Abs :- float__abs(Num, Abs).
+float__abs(Num, float__abs(Num)).
 
-float__max(X, Y, Max) :-
+float__max(X, Y) = Max :-
 	(
 		X >= Y
 	->
@@ -430,9 +454,9 @@
 		Max = Y
 	).
 
-float__max(X, Y) = Max :- float__max(X, Y, Max).
+float__max(X, Y, float__max(X, Y)).
 
-float__min(X, Y, Min) :-
+float__min(X, Y) = Min :-
 	(
 		X =< Y
 	->
@@ -441,12 +465,12 @@
 		Min = Y
 	).
 
-float__min(X, Y) = Min :- float__min(X, Y, Min).
+float__min(X, Y, float__min(X, Y)).
 
-% float_pow(Base, Exponent, Answer).
+% float_pow(Base, Exponent) = Answer.
 %	XXXX This function could be more efficient, with an int_mod pred, to
 %	reduce O(N) to O(logN) of the exponent.
-float__pow( X, Exp, Ans) :-
+float__pow(X, Exp) = Ans :-
 	( Exp < 0 ->
 		error("float__pow taken with exponent < 0\n")
 	; Exp = 1 ->
@@ -455,19 +479,18 @@
 		Ans = 1.0
 	;
 		New_e is Exp - 1,
-		float__pow(X, New_e, A2),
-		Ans is X * A2
+		Ans is X * float__pow(X, New_e)
 	).
 
-float__pow(X, Exp) = Pow :- float__pow(X, Exp, Pow).
+float__pow(X, Exp, float__pow(X, Exp)).
 
-:- pragma c_code(float__hash(F::in, H::out),
+:- pragma c_code(float__hash(F::in) = (H::out),
 	[will_not_call_mercury, thread_safe],
 "
 	H = hash_float(F);
 ").
 
-float__hash(F) = H :- float__hash(F, H).
+float__hash(F, float__hash(F)).
 
 %---------------------------------------------------------------------------%
 %
@@ -499,57 +522,57 @@
 ").
 
 	% Maximum floating-point number
-:- pragma c_code(float__max(Max::out),
+:- pragma c_code(float__max = (Max::uo),
 		[will_not_call_mercury, thread_safe],
 	"Max = ML_FLOAT_MAX;").
 
-float__max = Max :- float__max(Max).
+float__max(float__max).
 
 	% Minimum normalised floating-point number */
-:- pragma c_code(float__min(Min::out),
+:- pragma c_code(float__min = (Min::uo),
 		[will_not_call_mercury, thread_safe],
 	"Min = ML_FLOAT_MIN;").
 
-float__min = Min :- float__min(Min).
+float__min(float__min).
 
 	% Smallest x such that x \= 1.0 + x
-:- pragma c_code(float__epsilon(Eps::out),
+:- pragma c_code(float__epsilon = (Eps::uo),
 		[will_not_call_mercury, thread_safe],
 	"Eps = ML_FLOAT_EPSILON;").
 
-float__epsilon = Epsilon :- float__epsilon(Epsilon).
+float__epsilon(float__epsilon).
 
 	% Radix of the floating-point representation.
-:- pragma c_code(float__radix(Radix::out),
+:- pragma c_code(float__radix = (Radix::uo),
 		[will_not_call_mercury, thread_safe],
 	"Radix = ML_FLOAT_RADIX;").
 
-float__radix = Radix :- float__radix(Radix).
+float__radix(float__radix).
 
 	% The number of base-radix digits in the mantissa.
-:- pragma c_code(float__mantissa_digits(MantDig::out),
+:- pragma c_code(float__mantissa_digits = (MantDig::uo),
 		[will_not_call_mercury, thread_safe],
 	"MantDig = ML_FLOAT_MANT_DIG;").
 
-float__mantissa_digits = MantissaDig :- float__mantissa_digits(MantissaDig).
+float__mantissa_digits(float__mantissa_digits).
 
 	% Minimum negative integer such that:
 	%	radix ** (min_exponent - 1)
 	% is a normalised floating-point number.
-:- pragma c_code(float__min_exponent(MinExp::out),
+:- pragma c_code(float__min_exponent = (MinExp::uo),
 		[will_not_call_mercury, thread_safe],
 	"MinExp = ML_FLOAT_MIN_EXP;").
 
-float__min_exponent = MinExponent :- float__min_exponent(MinExponent).
+float__min_exponent(float__min_exponent).
 
 	% Maximum integer such that:
 	%	radix ** (max_exponent - 1)
 	% is a normalised floating-point number.
-:- pragma c_code(float__max_exponent(MaxExp::out),
+:- pragma c_code(float__max_exponent = (MaxExp::uo),
 		[will_not_call_mercury, thread_safe],
 	"MaxExp = ML_FLOAT_MIN_EXP;").
 
-float__max_exponent = MaxExponent :- float__max_exponent(MaxExponent).
+float__max_exponent(float__max_exponent).
 
 %---------------------------------------------------------------------------%
 %---------------------------------------------------------------------------%



More information about the developers mailing list