Module Gg.Float
Floating point number utilities.
This module defines a few useful constants, functions, predicates and comparisons on floating point numbers. The printers output a lossless textual representation of floats.
Quick recall on OCaml's floating point representation.
Constants
val e : float
The constant e.
val pi : float
The constant pi.
Functions
Note. If applicable, a function taking NaNs returns a NaN unless otherwise specified.
val random : ?min:float -> len:float -> unit -> float
random min len ()
is a random float in the interval [min;min+len
] (min
defaults to 0.). Uses the standard library's defaultRandom
state for the generation.Warning. The float generated by a given state may change in future versions of the library.
val srandom : Stdlib.Random.State.t -> ?min:float -> len:float -> unit -> float
srandom state min len ()
is likerandom
but usesstate
for the generation.Warning. The float generated by a given
state
may change in future versions of the library.
val step : float -> float -> float
step edge x
is0.
ifx < edge
and1.
otherwise. The result is undefined on NaNs.
val smooth_step : float -> float -> float -> float
smooth_step e0 e1 x
is0.
ifx <= e0
,1.
ifx >= e1
and cubic hermite interpolation between 0. and 1. otherwise. The result is undefined on NaNs.
val fmax : float -> float -> float
fmax x y
isy
ifx < y
andx
otherwise. Ifx
ory
is NaN returns the other argument. If both are NaNs returns NaN.
val fmin : float -> float -> float
fmin x y
isx
ifx < y
andy
otherwise. Ifx
ory
is NaN returns the other argument. If both are NaNs returns NaN.
val clamp : min:float -> max:float -> float -> float
clamp min max x
ismin
ifx < min
,max
ifx > max
andx
otherwise. The result is undefined on NaNs and ifmin > max
.
val remap : x0:float -> x1:float -> y0:float -> y1:float -> float -> float
remap x0 x1 y0 y1 v
applies tov
the affine transform that mapsx0
toy0
andx1
toy1
. If the transform is undefined (x0 = x1
andy0 <> y1
) the function returnsy0
for anyv
.
val round : float -> float
round x
is the integer nearest tox
. Ties are rounded towards positive infinity. Ifx
is an infinity, returnsx
.Note. If the absolute magnitude of
x
is an integer strictly greater thanmax_frac_float
,round x = x
may befalse
.
val int_of_round : float -> int
int_of_round x
istruncate (round v)
. The result is undefined on NaNs and infinities.
val round_dfrac : int -> float -> float
round_dfrac d x
roundsx
to thed
th decimal fractional digit. Ties are rounded towards positive infinity. Ifx
is an infinity, returnsx
. The result is only defined for0 <= d <= 16
.
val round_dsig : int -> float -> float
round_dsig d x
rounds the normalized decimal significand ofx
to thed
th decimal fractional digit. Ties are rounded towards positive infinity. The result is NaN on infinities. The result only defined for0 <= d <= 16
.Warning. The current implementation overflows on large
x
andd
.
val round_zero : eps:float -> float -> float
round_zero eps x
is0.
ifabs_float x < eps
andx
otherwise. The result is undefined ifeps
is NaN.
val chop : eps:float -> float -> float
chop eps x
isround x
ifabs_float (x -. round x) < eps
andx
otherwise. The result is undefined ifeps
is NaN.
val succ : float -> float
succ x
is the floating point value just afterx
towards positive infinity. Returns in particular :- NaN on NaNs.
infinity
oninfinity
.-max_float
onneg_infinity
.min_sub_float
on0.
or-0.
.
val pred : float -> float
pred x
is-. succ (-.x)
, i.e. the floating point value beforex
towards negative infinity.
Predicates and comparisons
val is_zero : eps:float -> float -> bool
is_zero eps x
istrue
ifabs_float x < eps
andfalse
otherwise. The result is undefined ifeps
is NaN.
val equal_tol : eps:float -> float -> float -> bool
equal_tol eps x y
istrue
iff |x - y
| <=eps
* max (1,|x
|,|y
|). On special values the function behaves likecompare x y = 0
. The condition turns into an absolute tolerance test for small magnitudes and a relative tolerance test for large magnitudes.
Printers
val pp : Stdlib.Format.formatter -> float -> unit
pp ppf x
prints a lossless textual representation ofx
onppf
.- Normals are represented by
"[-]0x1.<f>p<e>"
where<f>
is the significand bits in hexadecimal and<e>
the unbiased exponent in decimal. - Subnormals are represented by
"[-]0x0.<f>p-1022"
where<f>
is the significand bits in hexadecimal. - NaNs are represented by
"[-]nan(0x<p>)"
where<p>
is the payload in hexadecimal. - Infinities and zeroes are represented by
"[-]inf"
and"[-]0."
.
This format should be compatible with recent implementations of strtod and hence with
float_of_string
(but negative NaNs seem to be problematic to get back).- Normals are represented by
Quick recall on OCaml's float
s
An OCaml float
is an IEEE-754 64 bit double precision binary floating point number. The 64 bits are laid out as follows :
+----------------+-----------------------+-------------------------+ | sign s (1 bit) | exponent e (11 bits) | significand t (52 bits) | +----------------+-----------------------+-------------------------+ 63|62 52|51 0|
The value represented depends on s, e and t :
sign exponent significand value represented meaning ------------------------------------------------------------------------- s 0 0 -1^s * 0 zero s 0 t <> 0 -1^s * 0.t * 2^-1022 subnormal s 0 < e < 2047 f -1^s * 1.t * 2^(e - 1023) normal s 2047 0 -1^s * infinity infinity s 2047 t <> 0 NaN not a number
There are two zeros, a positive and a negative one but both are deemed equal by =
and Pervasives.compare
. A NaN is never equal (=) to itself or to another NaN however Pervasives.compare
asserts any NaN to be equal to itself and to any other NaN.
The bit layout of a float
can be converted to an int64
and back using Int64.bits_of_float
and Int64.float_of_bits
.
The bit 51 of a NaN is used to distinguish between quiet (bit set) and signaling NaNs (bit cleared); the remaining 51 lower bits of the significand are the NaN's payload which can be used to store diagnostic information. These features don't seem to used in OCaml.
The significand of a floating point number is made of 53 binary digits (don't forget the implicit digit), this corresponds to log10(253) ~ 16 decimal digits.
Only float
values in the interval ]-2
52;252[ may have a fractional part. Float.max_frac_float
is the greatest positive float
with a fractional part.
Any integer value in the interval [-2
53;253] can be represented exactly by a float
value. Integer arithmetic performed in this interval is exact. Float.max_int_arith
is 253.