Revision d948c0bd
Added by Pierre-Loïc Garoche over 6 years ago
include/mpfr_lustre.c | ||
---|---|---|
94 | 94 |
{ |
95 | 95 |
mpfr_clear(i); |
96 | 96 |
} |
97 |
|
|
98 |
// functions of lustrec_math |
|
99 |
void MPFRacos_step (mpfr_t i, |
|
100 |
mpfr_t out |
|
101 |
) |
|
102 |
{ |
|
103 |
mpfr_acos(out, i, MPFR_RNDN); |
|
104 |
} |
|
105 |
|
|
106 |
void MPFRacosh_step (mpfr_t i, |
|
107 |
mpfr_t out |
|
108 |
) |
|
109 |
{ |
|
110 |
mpfr_acosh(out, i, MPFR_RNDN); |
|
111 |
} |
|
112 |
void MPFRasin_step (mpfr_t i, |
|
113 |
mpfr_t out |
|
114 |
) |
|
115 |
{ |
|
116 |
mpfr_asin(out, i, MPFR_RNDN); |
|
117 |
} |
|
118 |
void MPFRasinh_step (mpfr_t i, |
|
119 |
mpfr_t out |
|
120 |
) |
|
121 |
{ |
|
122 |
mpfr_asinh(out, i, MPFR_RNDN); |
|
123 |
} |
|
124 |
void MPFRatan_step (mpfr_t i, |
|
125 |
mpfr_t out |
|
126 |
) |
|
127 |
{ |
|
128 |
mpfr_atan(out, i, MPFR_RNDN); |
|
129 |
} |
|
130 |
|
|
131 |
void MPFRatan2_step (mpfr_t y, mpfr_t x, |
|
132 |
mpfr_t out |
|
133 |
) |
|
134 |
{ |
|
135 |
mpfr_atan2(out, y, x, MPFR_RNDN); |
|
136 |
} |
|
137 |
|
|
138 |
void MPFRatanh_step (mpfr_t i, |
|
139 |
mpfr_t out |
|
140 |
) |
|
141 |
{ |
|
142 |
mpfr_atanh(out, i, MPFR_RNDN); |
|
143 |
} |
|
144 |
void MPFRcbrt_step (mpfr_t i, |
|
145 |
mpfr_t out |
|
146 |
) |
|
147 |
{ |
|
148 |
mpfr_cbrt(out, i, MPFR_RNDN); |
|
149 |
} |
|
150 |
|
|
151 |
void MPFRcos_step (mpfr_t i, |
|
152 |
mpfr_t out |
|
153 |
) |
|
154 |
{ |
|
155 |
mpfr_cos(out, i, MPFR_RNDN); |
|
156 |
} |
|
157 |
|
|
158 |
void MPFRcosh_step (mpfr_t i, |
|
159 |
mpfr_t out |
|
160 |
) |
|
161 |
{ |
|
162 |
mpfr_cosh(out, i, MPFR_RNDN); |
|
163 |
} |
|
164 |
|
|
165 |
void MPFRceil_step (mpfr_t i, |
|
166 |
mpfr_t out |
|
167 |
) |
|
168 |
{ |
|
169 |
mpfr_ceil(out, i); |
|
170 |
} |
|
171 |
|
|
172 |
void MPFRerf_step (mpfr_t i, |
|
173 |
mpfr_t out |
|
174 |
) |
|
175 |
{ |
|
176 |
mpfr_erf(out, i, MPFR_RNDN); |
|
177 |
} |
|
178 |
|
|
179 |
void MPFRexp_step (mpfr_t i, |
|
180 |
mpfr_t out |
|
181 |
) |
|
182 |
{ |
|
183 |
mpfr_exp(out, i, MPFR_RNDN); |
|
184 |
} |
|
185 |
|
|
186 |
void MPFRfabs_step (mpfr_t i, |
|
187 |
mpfr_t out |
|
188 |
) |
|
189 |
{ |
|
190 |
mpfr_abs(out, i, MPFR_RNDN); |
|
191 |
} |
|
192 |
|
|
193 |
void MPFRfloor_step (mpfr_t i, |
|
194 |
mpfr_t out |
|
195 |
) |
|
196 |
{ |
|
197 |
mpfr_floor(out, i); |
|
198 |
} |
|
199 |
|
|
200 |
void MPFRfmod_step (mpfr_t i1, mpfr_t i2, |
|
201 |
mpfr_t out |
|
202 |
) |
|
203 |
{ |
|
204 |
mpfr_fmod(out, i1, i2, MPFR_RNDN); |
|
205 |
} |
|
206 |
|
|
207 |
void MPFRlog_step (mpfr_t i, |
|
208 |
mpfr_t out |
|
209 |
) |
|
210 |
{ |
|
211 |
mpfr_log(out, i, MPFR_RNDN); |
|
212 |
} |
|
213 |
|
|
214 |
void MPFRlog10_step (mpfr_t i, |
|
215 |
mpfr_t out |
|
216 |
) |
|
217 |
{ |
|
218 |
mpfr_log10(out, i, MPFR_RNDN); |
|
219 |
} |
|
220 |
|
|
221 |
void MPFRpow_step (mpfr_t i1, mpfr_t i2, |
|
222 |
mpfr_t out |
|
223 |
) |
|
224 |
{ |
|
225 |
mpfr_pow(out, i1, i2, MPFR_RNDN); |
|
226 |
} |
|
227 |
|
|
228 |
void MPFRround_step (mpfr_t i, |
|
229 |
mpfr_t out |
|
230 |
) |
|
231 |
{ |
|
232 |
mpfr_round(out, i); |
|
233 |
} |
|
234 |
|
|
235 |
void MPFRsin_step (mpfr_t i, |
|
236 |
mpfr_t out |
|
237 |
) |
|
238 |
{ |
|
239 |
mpfr_sin(out, i, MPFR_RNDN); |
|
240 |
} |
|
241 |
|
|
242 |
void MPFRsinh_step (mpfr_t i, |
|
243 |
mpfr_t out |
|
244 |
) |
|
245 |
{ |
|
246 |
mpfr_sinh(out, i, MPFR_RNDN); |
|
247 |
} |
|
248 |
|
|
249 |
void MPFRsqrt_step (mpfr_t i, |
|
250 |
mpfr_t out |
|
251 |
) |
|
252 |
{ |
|
253 |
mpfr_sqrt(out, i, MPFR_RNDN); |
|
254 |
} |
|
255 |
|
|
256 |
void MPFRtrunc_step (mpfr_t i, |
|
257 |
mpfr_t out |
|
258 |
) |
|
259 |
{ |
|
260 |
mpfr_trunc(out, i); |
|
261 |
} |
|
262 |
|
|
263 |
void MPFRtan_step (mpfr_t i, |
|
264 |
mpfr_t out |
|
265 |
) |
|
266 |
{ |
|
267 |
mpfr_tan(out, i, MPFR_RNDN); |
|
268 |
} |
include/mpfr_lustre.lusi | ||
---|---|---|
1 |
|
|
2 |
|
|
3 | 1 |
function MPFRUminus(i: real) returns (out: real) lib gmp lib mpfr; |
4 | 2 |
|
5 | 3 |
function MPFRPlus(i1, i2: real) returns (out: real); |
... | ... | |
21 | 19 |
function MPFREq(i1, i2: real) returns (out: bool); |
22 | 20 |
|
23 | 21 |
function MPFRNeq(i1, i2: real) returns (out: bool); |
22 |
|
|
23 |
-- Functions already available in lustrec_math |
|
24 |
|
|
25 |
function MPFRacos (x: real) returns (y: real) ; |
|
26 |
function MPFRacosh (x: real) returns (y: real) ; |
|
27 |
function MPFRasin (x: real) returns (y: real) ; |
|
28 |
function MPFRasinh (x: real) returns (y: real) ; |
|
29 |
function MPFRatan (x: real) returns (y: real) ; |
|
30 |
function MPFRatan2(x:real; n: real) returns (y: real) ; |
|
31 |
function MPFRatanh (x: real) returns (y: real) ; |
|
32 |
function MPFRcbrt (x: real) returns (y: real) ; |
|
33 |
function MPFRcos (x: real) returns (y: real) ; |
|
34 |
function MPFRcosh (x: real) returns (y: real) ; |
|
35 |
function MPFRceil (x: real) returns (y: real) ; |
|
36 |
function MPFRerf (x: real) returns (y: real) ; |
|
37 |
function MPFRexp (x: real) returns (y: real) ; |
|
38 |
function MPFRfabs (x: real) returns (y: real) ; |
|
39 |
function MPFRfloor (x: real) returns (y: real) ; |
|
40 |
function MPFRfmod (x,y: real) returns (z: real) ; |
|
41 |
function MPFRlog (x: real) returns (y: real) ; |
|
42 |
function MPFRlog10 (x: real) returns (y: real) ; |
|
43 |
function MPFRpow (x:real; n: real) returns (y: real) ; |
|
44 |
function MPFRround (x: real) returns (y: real) ; |
|
45 |
function MPFRsin (x: real) returns (y: real) ; |
|
46 |
function MPFRsinh (x: real) returns (y: real) ; |
|
47 |
function MPFRsqrt (x: real) returns (y: real) ; |
|
48 |
function MPFRtrunc (x: real) returns (y: real) ; |
|
49 |
function MPFRtan (x: real) returns (y: real) ; |
src/backends/C/c_backend_src.ml | ||
---|---|---|
347 | 347 |
| MStep ([i0], i, vl) when Basic_library.is_value_internal_fun (mk_val (Fun (i, vl)) i0.var_type) -> |
348 | 348 |
pp_machine_instr dependencies m self fmt |
349 | 349 |
(update_instr_desc instr (MLocalAssign (i0, mk_val (Fun (i, vl)) i0.var_type))) |
350 |
| MStep (il, i, vl) when !Options.mpfr && Mpfr.is_homomorphic_fun i -> |
|
351 |
pp_instance_call m self fmt i vl il |
|
350 | 352 |
| MStep ([i0], i, vl) when has_c_prototype i dependencies -> |
351 | 353 |
fprintf fmt "%a = %s(%a);" |
352 | 354 |
(pp_c_val m self (pp_c_var_read m)) (mk_val (Var i0) i0.var_type) |
353 | 355 |
i |
354 | 356 |
(Utils.fprintf_list ~sep:", " (pp_c_val m self (pp_c_var_read m))) vl |
355 |
| MStep (il, i, vl) when Mpfr.is_homomorphic_fun i -> |
|
356 |
pp_instance_call m self fmt i vl il |
|
357 | 357 |
| MStep (il, i, vl) -> |
358 | 358 |
pp_basic_instance_call m self fmt i vl il |
359 | 359 |
| MBranch (_, []) -> (Format.eprintf "internal error: C_backend_src.pp_machine_instr %a@." (pp_instr m) instr; assert false) |
src/plugins/mpfr/mpfr.ml | ||
---|---|---|
97 | 97 |
| ">" -> "MPFRGt" |
98 | 98 |
| "=" -> "MPFREq" |
99 | 99 |
| "!=" -> "MPFRNeq" |
100 |
(* Math library functions *) |
|
101 |
| "acos" -> "MPFRacos" |
|
102 |
| "acosh" -> "MPFRacosh" |
|
103 |
| "asin" -> "MPFRasin" |
|
104 |
| "asinh" -> "MPFRasinh" |
|
105 |
| "atan" -> "MPFRatan" |
|
106 |
| "atan2" -> "MPFRatan2" |
|
107 |
| "atanh" -> "MPFRatanh" |
|
108 |
| "cbrt" -> "MPFRcbrt" |
|
109 |
| "cos" -> "MPFRcos" |
|
110 |
| "cosh" -> "MPFRcosh" |
|
111 |
| "ceil" -> "MPFRceil" |
|
112 |
| "erf" -> "MPFRerf" |
|
113 |
| "exp" -> "MPFRexp" |
|
114 |
| "fabs" -> "MPFRfabs" |
|
115 |
| "floor" -> "MPFRfloor" |
|
116 |
| "fmod" -> "MPFRfmod" |
|
117 |
| "log" -> "MPFRlog" |
|
118 |
| "log10" -> "MPFRlog10" |
|
119 |
| "pow" -> "MPFRpow" |
|
120 |
| "round" -> "MPFRround" |
|
121 |
| "sin" -> "MPFRsin" |
|
122 |
| "sinh" -> "MPFRsinh" |
|
123 |
| "sqrt" -> "MPFRsqrt" |
|
124 |
| "trunc" -> "MPFRtrunc" |
|
125 |
| "tan" -> "MPFRtan" |
|
126 |
|
|
127 |
|
|
128 |
| "pow" -> "MPFRpow" |
|
100 | 129 |
| _ -> raise Not_found |
101 | 130 |
|
102 | 131 |
let inject_op id = |
132 |
Format.eprintf "trying to inject mpfr into function %s@." id; |
|
103 | 133 |
try |
104 | 134 |
base_inject_op id |
105 | 135 |
with Not_found -> id |
Also available in: Unified diff
math fun lib support in MPFR