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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
open CCShims_
type t = float
type fpclass = Stdlib.fpclass =
| FP_normal
| FP_subnormal
| FP_zero
| FP_infinite
| FP_nan
module Infix = struct
let (=) : t -> t -> bool = Stdlib.(=)
let (<>) : t -> t -> bool = Stdlib.(<>)
let (<) : t -> t -> bool = Stdlib.(<)
let (>) : t -> t -> bool = Stdlib.(>)
let (<=) : t -> t -> bool = Stdlib.(<=)
let (>=) : t -> t -> bool = Stdlib.(>=)
let (~-) : t -> t = Stdlib.(~-.)
let (+) : t -> t -> t = Stdlib.(+.)
let (-) : t -> t -> t = Stdlib.(-.)
let ( * ) : t -> t -> t = Stdlib.( *. )
let (/) : t -> t -> t = Stdlib.(/.)
end
include Infix
let nan = Stdlib.nan
let infinity = Stdlib.infinity
let neg_infinity = Stdlib.neg_infinity
let max_value = infinity
let min_value = neg_infinity
let max_finite_value = Stdlib.max_float
let epsilon = Stdlib.epsilon_float
let pi = 0x1.921fb54442d18p+1
let is_nan x = Stdlib.(classify_float x = Stdlib.FP_nan)
let add = (+.)
let sub = (-.)
let mul = ( *. )
let div = (/.)
let neg = (~-.)
let abs = Stdlib.abs_float
let scale = ( *. )
let min (x : t) y =
match Stdlib.classify_float x, Stdlib.classify_float y with
| FP_nan, _ -> y
| _, FP_nan -> x
| _ -> if x < y then x else y
let max (x : t) y =
match Stdlib.classify_float x, Stdlib.classify_float y with
| FP_nan, _ -> y
| _, FP_nan -> x
| _ -> if x > y then x else y
let equal (a:float) b = a=b
let hash : t -> int = Hashtbl.hash
let compare (a:float) b = Stdlib.compare a b
type 'a printer = Format.formatter -> 'a -> unit
type 'a random_gen = Random.State.t -> 'a
let pp = Format.pp_print_float
let fsign a =
if is_nan a then nan
else if a = 0. then a
else Stdlib.copysign 1. a
exception TrapNaN of string
let sign_exn (a:float) =
if is_nan a then raise (TrapNaN "sign_exn")
else compare a 0.
let round x =
let low = floor x in
let high = ceil x in
if x-.low > high-.x then high else low
let to_int (a:float) = Stdlib.int_of_float a
let of_int (a:int) = Stdlib.float_of_int a
let to_string (a:float) = Stdlib.string_of_float a
let of_string_exn (a:string) = Stdlib.float_of_string a
let of_string_opt (a:string) =
try Some (Stdlib.float_of_string a)
with Failure _ -> None
let random n st = Random.State.float st n
let random_small = random 100.0
let random_range i j st = i +. random (j-.i) st
let equal_precision ~epsilon a b = abs_float (a-.b) < epsilon
let classify = Stdlib.classify_float