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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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"