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 : floatThe constant e.
val pi : floatThe constant pi.
Functions
Note. If applicable, a function taking NaNs returns a NaN unless otherwise specified.
val random : ?min:float -> len:float -> unit -> floatrandom min len ()is a random float in the interval [min;min+len] (mindefaults to 0.). Uses the standard library's defaultRandomstate 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 -> floatsrandom state min len ()is likerandombut usesstatefor the generation.Warning. The float generated by a given
statemay change in future versions of the library.
val step : float -> float -> floatstep edge xis0.ifx < edgeand1.otherwise. The result is undefined on NaNs.
val smooth_step : float -> float -> float -> floatsmooth_step e0 e1 xis0.ifx <= e0,1.ifx >= e1and cubic hermite interpolation between 0. and 1. otherwise. The result is undefined on NaNs.
val fmax : float -> float -> floatfmax x yisyifx < yandxotherwise. Ifxoryis NaN returns the other argument. If both are NaNs returns NaN.
val fmin : float -> float -> floatfmin x yisxifx < yandyotherwise. Ifxoryis NaN returns the other argument. If both are NaNs returns NaN.
val clamp : min:float -> max:float -> float -> floatclamp min max xisminifx < min,maxifx > maxandxotherwise. The result is undefined on NaNs and ifmin > max.
val remap : x0:float -> x1:float -> y0:float -> y1:float -> float -> floatremap x0 x1 y0 y1 vapplies tovthe affine transform that mapsx0toy0andx1toy1. If the transform is undefined (x0 = x1andy0 <> y1) the function returnsy0for anyv.
val round : float -> floatround xis the integer nearest tox. Ties are rounded towards positive infinity. Ifxis an infinity, returnsx.Note. If the absolute magnitude of
xis an integer strictly greater thanmax_frac_float,round x = xmay befalse.
val int_of_round : float -> intint_of_round xistruncate (round v). The result is undefined on NaNs and infinities.
val round_dfrac : int -> float -> floatround_dfrac d xroundsxto thedth decimal fractional digit. Ties are rounded towards positive infinity. Ifxis an infinity, returnsx. The result is only defined for0 <= d <= 16.
val round_dsig : int -> float -> floatround_dsig d xrounds the normalized decimal significand ofxto thedth 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
xandd.
val round_zero : eps:float -> float -> floatround_zero eps xis0.ifabs_float x < epsandxotherwise. The result is undefined ifepsis NaN.
val chop : eps:float -> float -> floatchop eps xisround xifabs_float (x -. round x) < epsandxotherwise. The result is undefined ifepsis NaN.
val succ : float -> floatsucc xis the floating point value just afterxtowards positive infinity. Returns in particular :- NaN on NaNs.
infinityoninfinity.-max_floatonneg_infinity.min_sub_floaton0.or-0..
val pred : float -> floatpred xis-. succ (-.x), i.e. the floating point value beforextowards negative infinity.
Predicates and comparisons
val is_zero : eps:float -> float -> boolis_zero eps xistrueifabs_float x < epsandfalseotherwise. The result is undefined ifepsis NaN.
val equal_tol : eps:float -> float -> float -> boolequal_tol eps x yistrueiff |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 -> unitpp ppf xprints a lossless textual representation ofxonppf.- 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 floats
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 ]-252;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 [-253;253] can be represented exactly by a float value. Integer arithmetic performed in this interval is exact. Float.max_int_arith is 253.