Next: gc, Previous: fat_sparse_bitset, Up: Top [Contents]
%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 1994-1998,2001-2008,2010, 2012 The University of Melbourne. % Copyright (C) 2013-2016, 2018-2020 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: float.m. % Main author: fjh. % Stability: medium. % % Floating point support. % % Floats are double precision, except in .spf grades where they % are single precision. % % Note that implementations which support IEEE floating point % should ensure that in cases where the only valid answer is a "NaN" % (the IEEE float representation for "not a number"), the det % functions here will halt with a runtime error (or throw an exception) % rather than returning a NaN. Quiet (non-signalling) NaNs have a % semantics which is not valid in Mercury, since they don't obey the % axiom "all [X] X = X". % % XXX Unfortunately the current Mercury implementation does not % do that on all platforms, since neither ANSI C nor POSIX provide % any portable way of ensuring that floating point operations % whose result is not representable will raise a signal rather % than returning a NaN. (Maybe C9X will help...?) % The behaviour is correct on Linux and Digital Unix, % but not on Solaris, for example. % % IEEE floating point also specifies that some functions should % return different results for +0.0 and -0.0, but that +0.0 and -0.0 % should compare equal. This semantics is not valid in Mercury, % since it doesn't obey the axiom `all [F, X, Y] X = Y => F(X) = F(Y)'. % Again, the resolution is that in Mercury, functions which would % return different results for +0.0 and -0.0 should instead halt % execution with a run-time error (or throw an exception). % % XXX Here too the current Mercury implementation does not % implement the intended semantics correctly on all platforms. % % XXX On machines such as x86 which support extra precision % for intermediate results, the results may depend on the % level of optimization, in particular inlining and evaluation % of constant expressions. % For example, the goal `1.0/9.0 = std_util.id(1.0)/9.0' may fail. % %--------------------------------------------------% %--------------------------------------------------% :- module float. :- interface. :- import_module pretty_printer. %--------------------------------------------------% % % Arithmetic functions. % % Addition. % :- func (float::in) + (float::in) = (float::uo) is det. % Subtraction. % :- func (float::in) - (float::in) = (float::uo) is det. % Multiplication. % :- func (float::in) * (float::in) = (float::uo) is det. % Division. % Throws a `domain_error' exception if the right operand is zero. % See the comments at the top of math.m to find out how to disable % this check. % :- func (float::in) / (float::in) = (float::uo) is det. % unchecked_quotient(X, Y) is the same as X / Y, but the behaviour % is undefined if the right operand is zero. % :- func unchecked_quotient(float::in, float::in) = (float::uo) is det. % Unary plus. % :- func + (float::in) = (float::uo) is det. % Unary minus. % :- func - (float::in) = (float::uo) is det. %--------------------------------------------------% % % Comparison predicates. % % Less than. % :- pred (float::in) < (float::in) is semidet. % Less than or equal. % :- pred (float::in) =< (float::in) is semidet. % Greater than or equal. % :- pred (float::in) >= (float::in) is semidet. % Greater than. % :- pred (float::in) > (float::in) is semidet. %--------------------------------------------------% % % Conversion from integer types. % % Convert an int into float. % % The behaviour when the int exceeds the range of what can be exactly % represented by a float is undefined. % :- func float(int) = float. % Convert a signed 8-bit integer into a float. % Always succeeds as all signed 8-bit integers have an exact % floating-point representation. % :- func from_int8(int8) = float. % Convert a signed 16-bit integer into a float. % Always succeeds as all signed 16-bit integers have an exact % floating-point representation. % :- func from_int16(int16) = float. % Convert a signed 32-bit integer into a float. % The behaviour when the integer exceeds the range of what can be % exactly represented by a float is undefined. % :- func cast_from_int32(int32) = float. % Convert a signed 64-bit integer into a float. % The behaviour when the integer exceeds the range of what can be % exactly represented by a float is undefined. % :- func cast_from_int64(int64) = float. % Convert an unsigned 8-bit integer into a float. % Always succeeds as all unsigned 8-bit integers have an exact % floating-point representation. % :- func from_uint8(uint8) = float. % Convert an unsigned 16-bit integer into a float. % Always succeeds as all unsigned 16-bit integers have an exact % floating-point representation. % :- func from_uint16(uint16) = float. % Convert an unsigned 32-bit integer into a float. % The behaviour when the integer exceeds the range of what can be % exactly represented by a float is undefined. % :- func cast_from_uint32(uint32) = float. % Convert an unsigned 64-bit integer into a float. % The behaviour when the integer exceeds the range of what can be % exactly represented by a float is undefined. % :- func cast_from_uint64(uint64) = float. %--------------------------------------------------% % % Conversion to int. % % ceiling_to_int(X) returns the smallest integer not less than X. % :- func ceiling_to_int(float) = int. % floor_to_int(X) returns the largest integer not greater than X. % :- func floor_to_int(float) = int. % round_to_int(X) returns the integer closest to X. % If X has a fractional value of 0.5, it is rounded up. % :- func round_to_int(float) = int. % truncate_to_int(X) returns the integer closest to X such that % |truncate_to_int(X)| =< |X|. % :- func truncate_to_int(float) = int. %--------------------------------------------------% % % Miscellaneous functions. % % Absolute value. % :- func abs(float) = float. % Maximum. % :- func max(float, float) = float. % Minimum. % :- func min(float, float) = float. % pow(Base, Exponent) returns Base raised to the power Exponent. % Fewer domain restrictions than math.pow: works for negative Base, % and pow(B, 0) = 1.0 for all B, even B=0.0. % Only pow(0, <negative>) throws a `domain_error' exception. % :- func pow(float, int) = float. % Compute a non-negative integer hash value for a float. % :- func hash(float) = int. :- pred hash(float::in, int::out) is det. %--------------------------------------------------% % % Classification. % % True iff the argument is of infinite magnitude. % :- pred is_infinite(float::in) is semidet. % Synonym for the above. % :- pred is_inf(float::in) is semidet. % True iff the argument is not-a-number (NaN). % :- pred is_nan(float::in) is semidet. % True iff the argument is of infinite magnitude or not-a-number (NaN). % :- pred is_nan_or_infinite(float::in) is semidet. % Synonym for the above. % :- pred is_nan_or_inf(float::in) is semidet. % True iff the argument is not of infinite magnitude and is not a % not-a-number (NaN) value. % :- pred is_finite(float::in) is semidet. % True iff the argument is of zero magnitude. % :- pred is_zero(float::in) is semidet. %--------------------------------------------------% % % System constants. % % Maximum finite floating-point number. % % max = (1 - radix ** mantissa_digits) * radix ** max_exponent % :- func max = float. % Minimum normalised positive floating-point number. % % min = radix ** (min_exponent - 1) % :- func min = float. % Positive infinity. % :- func infinity = float. % Smallest number x such that 1.0 + x \= 1.0. % This represents the largest relative spacing of two consecutive floating % point numbers. % % epsilon = radix ** (1 - mantissa_digits) % :- func epsilon = float. % Radix of the floating-point representation. % In the literature, this is sometimes referred to as `b'. % :- func radix = int. % The number of base-radix digits in the mantissa. % In the literature, this is sometimes referred to as `p' or `t'. % :- func mantissa_digits = int. % Minimum negative integer such that: % radix ** (min_exponent - 1) % is a normalised floating-point number. In the literature, % this is sometimes referred to as `e_min'. % :- func min_exponent = int. % Maximum integer such that: % radix ** (max_exponent - 1) % is a normalised floating-point number. % In the literature, this is sometimes referred to as `e_max'. % :- func max_exponent = int. %--------------------------------------------------% % Convert a float to a pretty_printer.doc for formatting. % :- func float_to_doc(float) = doc. %--------------------------------------------------% %--------------------------------------------------%
Next: gc, Previous: fat_sparse_bitset, Up: Top [Contents]