1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
let () = Error.init ()
type ieee_type = NAN | INF | NORMAL | DENORMAL | ZERO
type float_rep = {
sign : int;
mantissa : string;
exponent : int;
ieee_type : ieee_type;
}
external rep_of_float : float -> float_rep = "ml_gsl_ieee_double_to_rep"
external env_setup : unit -> unit = "ml_gsl_ieee_env_setup"
type precision = SINGLE | DOUBLE | EXTENDED
type rounding = TO_NEAREST | DOWN | UP | TO_ZERO
type exceptions =
| MASK_INVALID
| MASK_DENORMALIZED
| MASK_DIVISION_BY_ZERO
| MASK_OVERFLOW
| MASK_UNDERFLOW
| MASK_ALL
| TRAP_INEXACT
external set_mode :
?precision:precision -> ?rounding:rounding -> exceptions list -> unit
= "ml_gsl_ieee_set_mode"
let print f =
let rep = rep_of_float f in
match rep.ieee_type with
| NAN -> "NaN"
| INF when rep.sign = 0 -> "Inf"
| INF -> "-Inf"
| ZERO when rep.sign = 0 -> "0"
| ZERO -> "-0"
| DENORMAL ->
(if rep.sign = 0 then "" else "-")
^ "0." ^ rep.mantissa
^ if rep.exponent = 0 then "" else string_of_int rep.exponent
| NORMAL ->
(if rep.sign = 0 then "" else "-")
^ "1." ^ rep.mantissa
^ if rep.exponent = 0 then "" else "*2^" ^ string_of_int rep.exponent
type excepts =
| FE_INEXACT
| FE_DIVBYZERO
| FE_UNDERFLOW
| FE_OVERFLOW
| FE_INVALID
| FE_ALL_EXCEPT
external clear_except : excepts list -> unit = "ml_feclearexcept"
external test_except : excepts list -> excepts list = "ml_fetestexcept"