source: CIVL/src/include/civl/math.cvl@ 68524f3b

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 68524f3b was 0871d34, checked in by Ziqing Luo <ziqing@…>, 8 years ago

Do transformation as little as ABC can to "normalize" variable declarations with external linkages.

Eventually,

  1. "extern" and "const" specifiers and qualifiers will be removed..
  2. no variable declarations with external linkages can happen in block scope

Corresponding changes in CIVL

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@4668 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 28.9 KB
RevLine 
[7ccfc08]1/* CIVL model of math.h. Part of functions have optional assumption
2 * models which are controlled by two macros:
3 * 1. MATH_ELABORATE_ASSUMPTIONS: replacing a complicated assumption
4 * expression which includes implications with a "if..else" statement.
5 * This option reduces the complicity of the assumption expression but
6 * increase the number of branches.
7 * 2. MATH_NO_ASSUMPTIONS: for some cases that the return value is not
8 * important, it's no need to add any assumption.
9 */
[9e6785d]10
[bf584ca]11#ifndef __CIVL_MATH__
[d42b98b]12#define __CIVL_MATH__
[bf584ca]13#include <civlc.cvh>
[869af89]14#include <math.h>
[9e6785d]15
[869af89]16double acos(double x) {
17 $abstract double ACOS(double X);
[d42b98b]18 double result;
[9e6785d]19
[3ff27cf]20 $assert(-1 <= x && x <=1, "Argument x should be in interval[-1, 1]");
[d42b98b]21 result = ACOS(x);
22#ifdef MATH_ELABORATE_ASSUMPTIONS
23 if(x == 1)
24 return 0;
25 else {
[3ff27cf]26 $assume(result > 0);
[d42b98b]27 return result;
28 }
29#elif defined(MATH_NO_ASSUMPTIONS)
30 return result;
31#else
[3ff27cf]32 $assume(((x == 1 => result == 0) && (x != 1 => result > 0)));
[d42b98b]33 return result;
34#endif
[869af89]35}
36
37float acosf(float x) {
38 $abstract float ACOSF(float X);
[d42b98b]39 double result;
[869af89]40
[3ff27cf]41 $assert(-1 <= x && x <=1, "Argument x should be in interval[-1, 1]");
[d42b98b]42 result = ACOSF(x);
43#ifdef MATH_ELABORATE_ASSUMPTIONS
44 if(x == 1)
45 return 0;
46 else {
[3ff27cf]47 $assume(result > 0);
[d42b98b]48 return result;
49 }
50#elif defined(MATH_NO_ASSUMPTIONS)
51 return result;
52#else
[3ff27cf]53 $assume(((x == 1 => result == 0) && (x != 1 => result > 0)));
[d42b98b]54 return result;
55#endif
[869af89]56}
57
58long double acosl(long double x) {
59 $abstract long double ACOSL(long double X);
[d42b98b]60 double result;
[869af89]61
[3ff27cf]62 $assert(-1 <= x && x <=1, "Argument x should be in interval[-1, 1]");
[d42b98b]63 result = ACOSL(x);
64#ifdef MATH_ELABORATE_ASSUMPTIONS
65 if(x == 1)
66 return 0;
67 else {
[3ff27cf]68 $assume(result > 0);
[d42b98b]69 return result;
70 }
71#elif defined(MATH_NO_ASSUMPTIONS)
72 return result;
73#else
[3ff27cf]74 $assume(((x == 1 => result == 0) && (x != 1 => result > 0)));
[d42b98b]75 return result;
76#endif
[869af89]77}
78
79double asin(double x) {
80 $abstract double ASIN(double X);
81
[3ff27cf]82 $assert(-1 <= x && x <= 1);
[869af89]83 "Argument x should be in interval[-1, 1]";
84 return ASIN(x);
85}
86
87float asinf(float x) {
88 $abstract float ASINF(float X);
89
[3ff27cf]90 $assert(-1 <= x && x <= 1);
[869af89]91 "Argument x should be in interval[-1, 1]";
92 return ASINF(x);
93}
94
95long double asinl(long double x) {
96 $abstract long double ASINL(long double X);
97
[3ff27cf]98 $assert(-1 <= x && x <= 1);
[869af89]99 "Argument x should be in interval[-1, 1]";
100 return ASINL(x);
101}
102
103double atan(double x) {
104 $abstract double ATAN(double X);
105 return ATAN(x);
106}
107
108float atanf(float x) {
109 $abstract float ATANF(float X);
110 return ATANF(x);
111}
112
113long double atanl(long double x) {
114 $abstract long double ATANL(long double X);
115 return ATANL(x);
116}
117
118double atan2(double x, double y) {
119 $abstract double ATAN2(double X, double Y);
120
[3ff27cf]121 $assert(x!=0 || y !=0, "Arguments x and y"
122 "should not be both 0");
[869af89]123 return ATAN2(x, y);
124}
125
126float atan2f(float x, float y) {
127 $abstract float ATAN2F(float X, float Y);
128
[3ff27cf]129 $assert(x!=0.0 || y !=0.0, "Arguments x and y should not be both 0");
[869af89]130 return ATAN2F(x, y);
131}
132
133long double atan2l(long double x, long double y) {
134 $abstract long double ATAN2L(long double X,
135 long double Y);
136
[3ff27cf]137 $assert(x!=0.0 || y !=0.0, "Arguments x and y should not be both 0");
[869af89]138 return ATAN2L(x, y);
139}
140
141double cos(double x) {
142 $abstract double COS(double X);
143
144 return COS(x);
145}
146
147float cosf(float x) {
148 $abstract float COSF(float X);
149
150 return COSF(x);
151}
152
153long double cosl(long double x) {
154 $abstract long double COSL(long double X);
155
156 return COSL(x);
157}
158
159double sin(double x) {
160 $abstract double SIN(double X);
161
162 return SIN(x);
163}
164
165float sinf(float x) {
166 $abstract float SINF(float X);
167
168 return SINF(x);
169}
170
171long double sinl(long double x) {
172 $abstract long double SINL(long double X);
173
174 return SINL(x);
175}
176
177double tan(double x) {
178 $abstract double TAN(double X);
179
180 return TAN(x);
181}
182
183float tanf(float x) {
184 $abstract float TANF(float X);
185
186 return TANF(x);
187}
188
189long double tanl(long double x) {
190 $abstract long double TANL(long double X);
191
192 return TANL(x);
193}
194
195double acosh(double x) {
196 $abstract double ACOSH(double X);
197
[3ff27cf]198 $assert(x >= 1, "Argument x should not less than 1.");
[869af89]199 return ACOSH(x);
200}
201
202float acoshf(float x) {
203 $abstract float ACOSHF(float X);
[9e6785d]204
[3ff27cf]205 $assert(x >= 1, "Argument x should not less than 1.");
[869af89]206 return ACOSHF(x);
207}
208
209long double acoshl(long double x) {
210 $abstract long double ACOSHL(long double X);
211
[3ff27cf]212 $assert(x >= 1, "Argument x should not less than 1.");
[869af89]213 return ACOSHL(x);
214}
215
216double asinh(double x) {
217 $abstract double ASINH(double X);
218
219 return ASINH(x);
220}
221
222float asinhf(float x) {
223 $abstract float ASINHF(float X);
224
225 return ASINHF(x);
226}
227
228long double asinhl(long double x) {
229 $abstract long double ASINHL(long double X);
230
231 return ASINHL(x);
232}
233
234double atanh(double x) {
235 $abstract double ATANH(double X);
236
[3ff27cf]237 $assert(-1 < x && x < 1, "Argument x should be in the interval (-1, 1)");
[869af89]238 return ATANH(x);
239}
240
241float atanhf(float x) {
242 $abstract float ATANHF(float X);
243
[3ff27cf]244 $assert(-1 < x && x < 1, "Argument x should be in the interval (-1, 1)");
[869af89]245 return ATANHF(x);
246}
247
248long double atanhl(long double x) {
249 $abstract long double ATANHL(long double X);
250
[3ff27cf]251 $assert(-1 < x && x < 1, "Argument x should be in the interval (-1, 1)");
[869af89]252 return ATANHL(x);
253}
254
255double cosh(double x) {
256 $abstract double COSH(double X);
257
258 return COSH(x);
259}
260
261float coshf(float x) {
262 $abstract float COSHF(float X);
263
264 return COSHF(x);
265}
266
267long double coshl(long double x) {
268 $abstract long double COSHL(long double X);
269
270 return COSHL(x);
271}
[9e6785d]272
[869af89]273double sinh(double x) {
274 $abstract double SINH(double X);
[9e6785d]275
[869af89]276 return SINH(x);
277}
278
279float sinhf(float x) {
280 $abstract float SINHF(float X);
281
282 return SINHF(x);
283}
284
285long double sinhl(long double x) {
286 $abstract long double SINHL(long double X);
287
288 return SINHL(x);
289}
290
291double tanh(double x) {
292 $abstract double TANH(double X);
[9e6785d]293
[869af89]294 return TANH(x);
295}
296
297float tanhf(float x) {
298 $abstract float TANHF(float X);
299
300 return TANHF(x);
301}
[9e6785d]302
[869af89]303long double tanhl(long double x) {
304 $abstract long double TANHL(long double X);
[9e6785d]305
[869af89]306 return TANHL(x);
307}
308
309double exp(double x) {
310 $abstract double EXP(double X);
[d42b98b]311 double result = EXP(x);
312
313#ifdef MATH_ELABORATE_ASSUMPTIONS
314 if(x == 0)
315 return 1;
316 else {
[3ff27cf]317 $assume(result > 0);
[d42b98b]318 return result;
319 }
320#elif defined(MATH_NO_ASSUMPTIONS)
321 return result;
322#else
[3ff27cf]323 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
[d42b98b]324 return result;
325#endif
[869af89]326}
327
328float expf(float x) {
329 $abstract float EXPF(float X);
[d42b98b]330 double result = EXPF(x);
331
332#ifdef MATH_ELABORATE_ASSUMPTIONS
333 if(x == 0)
334 return 1;
335 else {
[3ff27cf]336 $assume(result > 0 );
[d42b98b]337 return result;
338 }
339#elif defined(MATH_NO_ASSUMPTIONS)
340 return result;
341#else
[3ff27cf]342 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
[d42b98b]343 return result;
344#endif
[869af89]345}
346
347long double expl(long double x) {
348 $abstract long double EXPL(long double X);
[d42b98b]349 double result = EXPL(x);
350
351#ifdef MATH_ELABORATE_ASSUMPTIONS
352 if(x == 0)
353 return 1;
354 else {
[3ff27cf]355 $assume(result > 0 );
[d42b98b]356 return result;
357 }
358#elif defined(MATH_NO_ASSUMPTIONS)
359 return result;
360#else
[3ff27cf]361 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
[d42b98b]362 return result;
363#endif
[869af89]364}
365
366double exp2(double x) {
367 $abstract double EXP2(double X);
[d42b98b]368 double result = EXP2(x);
369
370#ifdef MATH_ELABORATE_ASSUMPTIONS
371 if(x == 0)
372 return 1;
373 else {
[3ff27cf]374 $assume(result > 0 );
[d42b98b]375 return result;
376 }
377#elif defined(MATH_NO_ASSUMPTIONS)
378 return result;
379#else
[3ff27cf]380 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
[d42b98b]381 return result;
382#endif
[869af89]383}
384
385float exp2f(float x) {
386 $abstract float EXP2F(float X);
[d42b98b]387 double result = EXP2F(x);
388
389#ifdef MATH_ELABORATE_ASSUMPTIONS
390 if(x == 0)
391 return 1;
392 else {
[3ff27cf]393 $assume(result > 0 );
[d42b98b]394 return result;
395 }
396#elif defined(MATH_NO_ASSUMPTIONS)
397 return result;
398#else
[3ff27cf]399 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
[d42b98b]400 return result;
401#endif
[869af89]402}
403
404long double exp2l(long double x) {
405 $abstract long double EXP2L(long double X);
[d42b98b]406 double result = EXP2L(x);
407
408#ifdef MATH_ELABORATE_ASSUMPTIONS
409 if(x == 0)
410 return 1;
411 else {
[3ff27cf]412 $assume(result > 0 );
[d42b98b]413 return result;
414 }
415#elif defined(MATH_NO_ASSUMPTIONS)
416 return result;
417#else
[3ff27cf]418 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
[d42b98b]419 return result;
420#endif
[869af89]421}
[9e6785d]422
[869af89]423double expm1(double x) {
424 $abstract double EXPM1(double X);
[d42b98b]425 double result = EXPM1(x);
426
427#ifdef MATH_ELABORATE_ASSUMPTIONS
428 if(x == 0)
429 return 0;
430 else {
[3ff27cf]431 $assume(result > -1);
[d42b98b]432 return result;
433 }
434#elif defined(MATH_NO_ASSUMPTIONS)
435 return result;
436#else
[3ff27cf]437 $assume(((x==0 => result == 0) && (x!=0 => result > -1)));
[d42b98b]438 return result;
439#endif
[869af89]440}
441
442float expm1f(float x) {
443 $abstract float EXPM1F(float X);
[d42b98b]444 double result = EXPM1F(x);
445
446#ifdef MATH_ELABORATE_ASSUMPTIONS
447 if(x == 0)
448 return 0;
449 else {
[3ff27cf]450 $assume(result > -1);
[d42b98b]451 return result;
452 }
453#elif defined(MATH_NO_ASSUMPTIONS)
454 return result;
455#else
[3ff27cf]456 $assume(((x==0 => result == 0) && (x!=0 => result > -1)));
[d42b98b]457 return result;
458#endif
[869af89]459}
460
461long double expm1l(long double x) {
462 $abstract long double EXPM1L(long double X);
[d42b98b]463 double result = EXPM1L(x);
464
465#ifdef MATH_ELABORATE_ASSUMPTIONS
466 if(x == 0)
467 return 0;
468 else {
[3ff27cf]469 $assume(result > -1);
[d42b98b]470 return result;
471 }
472#elif defined(MATH_NO_ASSUMPTIONS)
473 return result;
474#else
[3ff27cf]475 $assume(((x==0 => result == 0) && (x!=0 => result > -1)));
[d42b98b]476 return result;
477#endif
[869af89]478}
479
480double frexp(double x, int * exp) {
481 $abstract double FREXP_X(double X);
482 $abstract int FREXP_EXP(double X);
483
484 (*exp) = FREXP_EXP(x);
[3ff27cf]485 $assume((FREXP_X(x) >= 1/2 && FREXP_X(x) < 1) ||
486 FREXP_X(x) == 0);
[869af89]487 return FREXP_X(x);
488}
489
490float frexpf(float x, int *exp) {
491 $abstract float FREXPF_X(float X);
492 $abstract int FREXPF_EXP(float X);
493
494 (*exp) = FREXPF_EXP(x);
[3ff27cf]495 $assume((FREXPF_X(x) >= 1/2 && FREXPF_X(x) < 1) ||
496 FREXPF_X(x) == 0);
[869af89]497 return FREXPF_X(x);
498}
499
500long double frexpl(long double x, int *exp) {
501 $abstract long double FREXPL_X(long double X);
502 $abstract int FREXPL_EXP(long double X);
503
504 (*exp) = FREXPL_EXP(x);
[3ff27cf]505 $assume((FREXPL_X(x) >= 1/2 && FREXPL_X(x) < 1) ||
506 FREXPL_X(x) == 0);
[869af89]507 return FREXPL_X(x);
508}
509
510int ilogb(double x) {
511 $abstract int ILOGB(double X);
512
513 //TODO: x can not be infinite or NaN neither.
[3ff27cf]514 $assert(x != 0, "Argument x cannot be zero.");
[869af89]515 return ILOGB(x);
516}
517
518int ilogbf(float x) {
519 $abstract int ILOGBF(float X);
520
521 //TODO: x can not be infinite or NaN neither.
[3ff27cf]522 $assert(x != 0, "Argument x cannot be zero.");
[869af89]523 return ILOGBF(x);
524}
525
526int ilogbl(long double x) {
527 $abstract int ILOGBL(long double X);
528
529 //TODO: x can not be infinite or NaN neither.
[3ff27cf]530 $assert(x != 0, "Argument x cannot be zero.");
[869af89]531 return ILOGBL(x);
532}
533
534double ldexp(double x, int exp) {
535 $abstract double LDEXP(double X, int EXP);
536
537 return LDEXP(x, exp);
538}
539
540float ldexpf(float x, int exp) {
541 $abstract float LDEXPF(float X, int EXP);
542
543 return LDEXPF(x, exp);
544}
545
546long double ldexpl(long double x, int exp) {
547 $abstract long double LDEXPL(long double X, int EXP);
548
549 return LDEXPL(x, exp);
550}
551
552double log(double x) {
553 $abstract double LOG(double X);
[0218e63]554 double result = LOG(x);
[869af89]555
[3ff27cf]556 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]557#ifdef MATH_ELABORATE_ASSUMPTIONS
558 if(x == 1)
559 return 0;
560 else {
[3ff27cf]561 $assume(result != 0);
[0218e63]562 return result;
563 }
564#elif defined(MATH_NO_ASSUMPTIONS)
565 return result;
566#else
[3ff27cf]567 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]568 return result;
569#endif
[869af89]570}
571
572float logf(float x) {
573 $abstract float LOGF(float X);
[0218e63]574 float result = LOGF(x);
[869af89]575
[3ff27cf]576 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]577#ifdef MATH_ELABORATE_ASSUMPTIONS
578 if(x == 1)
579 return 0;
580 else {
[3ff27cf]581 $assume(result != 0);
[0218e63]582 return result;
583 }
584#elif defined(MATH_NO_ASSUMPTIONS)
585 return result;
586#else
[3ff27cf]587 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]588 return result;
589#endif
[869af89]590}
591
592long double logl(long double x) {
593 $abstract long double LOGL(long double X);
[0218e63]594 long double result = LOGL(x);
[869af89]595
[3ff27cf]596 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]597#ifdef MATH_ELABORATE_ASSUMPTIONS
598 if(x == 1)
599 return 0;
600 else {
[3ff27cf]601 $assume(result != 0);
[0218e63]602 return result;
603 }
604#elif defined(MATH_NO_ASSUMPTIONS)
605 return result;
606#else
[3ff27cf]607 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]608 return result;
609#endif
[869af89]610}
611
612double log10(double x) {
613 $abstract double LOG10(double X);
[0218e63]614 double result = LOG10(x);
[869af89]615
[3ff27cf]616 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]617#ifdef MATH_ELABORATE_ASSUMPTIONS
618 if(x == 1)
619 return 0;
620 else {
[3ff27cf]621 $assume(result != 0);
[0218e63]622 return result;
623 }
624#elif defined(MATH_NO_ASSUMPTIONS)
625 return result;
626#else
[3ff27cf]627 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]628 return result;
629#endif
[869af89]630}
631
632float log10f(float x) {
633 $abstract float LOG10F(float X);
[0218e63]634 float result = LOG10F(x);
[869af89]635
[3ff27cf]636 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]637#ifdef MATH_ELABORATE_ASSUMPTIONS
638 if(x == 1)
639 return 0;
640 else {
[3ff27cf]641 $assume(result != 0);
[0218e63]642 return result;
643 }
644#elif defined(MATH_NO_ASSUMPTIONS)
645 return result;
646#else
[3ff27cf]647 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]648 return result;
649#endif
[869af89]650}
651
652long double log10l(long double x) {
653 $abstract long double LOG10L(long double X);
[0218e63]654 long double result = LOG10L(x);
[869af89]655
[3ff27cf]656 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]657#ifdef MATH_ELABORATE_ASSUMPTIONS
658 if(x == 1)
659 return 0;
660 else {
[3ff27cf]661 $assume(result != 0);
[0218e63]662 return result;
663 }
664#elif defined(MATH_NO_ASSUMPTIONS)
665 return result;
666#else
[3ff27cf]667 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]668 return result;
669#endif
[869af89]670}
671
672double log1p(double x) {
673 $abstract double LOG1P(double X);
674
[3ff27cf]675 $assert(x > -1, "Argument x should be greater than -1");
[869af89]676 return LOG1P(x);
677}
678
679float log1pf(float x) {
680 $abstract float LOG1PF(float X);
681
[3ff27cf]682 $assert(x > -1, "Argument x should be greater than -1");
[869af89]683 return LOG1PF(x);
684}
685
686long double log1pl(long double x) {
687 $abstract long double LOG1PL(long double X);
688
[3ff27cf]689 $assert(x > -1, "Argument x should be greater than -1");
[869af89]690 return LOG1PL(x);
691}
692
693double log2(double x) {
694 $abstract double LOG2(double X);
[0218e63]695 double result = LOG2(x);
[869af89]696
[3ff27cf]697 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]698#ifdef MATH_ELABORATE_ASSUMPTIONS
699 if(x == 1)
700 return 0;
701 else {
[3ff27cf]702 $assume(result != 0);
[0218e63]703 return result;
704 }
705#elif defined(MATH_NO_ASSUMPTIONS)
706 return result;
707#else
[3ff27cf]708 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]709 return result;
710#endif
[869af89]711}
712
713float log2f(float x) {
714 $abstract float LOG2F(float X);
[0218e63]715 float result = LOG2F(x);
[869af89]716
[3ff27cf]717 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]718 #ifdef MATH_ELABORATE_ASSUMPTIONS
719 if(x == 1)
720 return 0;
721 else {
[3ff27cf]722 $assume(result != 0);
[0218e63]723 return result;
724 }
725#elif defined(MATH_NO_ASSUMPTIONS)
726 return result;
727#else
[3ff27cf]728 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]729 return result;
730#endif
[869af89]731}
732
733long double log2l(long double x) {
734 $abstract long double LOG2L(long double X);
[0218e63]735 long double result = LOG2L(x);
[869af89]736
[3ff27cf]737 $assert(x > 0, "Argument x should be greater than 0");
[0218e63]738#ifdef MATH_ELABORATE_ASSUMPTIONS
739 if(x == 1)
740 return 0;
741 else {
[3ff27cf]742 $assume(result != 0);
[0218e63]743 return result;
744 }
745#elif defined(MATH_NO_ASSUMPTIONS)
746 return result;
747#else
[3ff27cf]748 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
[0218e63]749 return result;
750#endif
[869af89]751}
752
753double logb(double x) {
754 $abstract double LOGB(double X);
755
[3ff27cf]756 $assert(x != 0, "Argument x should not equal to 0");
[869af89]757 return LOGB(x);
758}
759
760float logbf(float x) {
761 $abstract float LOGBF(float X);
762
[3ff27cf]763 $assert(x != 0, "Argument x should not equal to 0");
[869af89]764 return LOGBF(x);
765}
766
767long double logbl(long double x) {
768 $abstract long double LOGBL(long double X);
769
[3ff27cf]770 $assert(x != 0, "Argument x should not equal to 0");
[869af89]771 return LOGBL(x);
772}
773
774double modf(double value, double *iptr) {
775 $abstract double MODF_VALUE(double v);
776 $abstract double MODF_EXP(double v);
777
778 (*iptr) = MODF_EXP(value);
779 return MODF_VALUE(value);
780}
781
782float modff(float value, float *iptr) {
783 $abstract float MODFF_VALUE(float v);
784 $abstract float MODFF_EXP(float v);
785
786 (*iptr) = MODFF_EXP(value);
787 return MODFF_VALUE(value);
788}
789
790long double modfl(long double value, long double *iptr) {
791 $abstract long double MODFL_VALUE(long double v);
792 $abstract long double MODFL_EXP(long double v);
793
794 (*iptr) = MODFL_EXP(value);
795 return MODFL_VALUE(value);
796}
797
798double scalbn(double x, int n) {
799 $abstract double SCALBN(double x, int n);
800
801 return SCALBN(x, n);
802}
803
804float scalbnf(float x, int n) {
805 $abstract float SCALBNF(float x, int n);
806
807 return SCALBNF(x, n);
808}
809
810long double scalbnl(long double x, int n) {
811 $abstract long double SCALBNL(long double x, int n);
812
813 return SCALBNL(x, n);
814}
815
816double scalbln(double x, int n) {
817 $abstract double SCALBLN(double x, int n);
818
819 return SCALBLN(x, n);
820}
821
822float scalblnf(float x, int n) {
823 $abstract float SCALBLNF(float x, int n);
824
825 return SCALBLNF(x, n);
826}
827
828long double scalblnl(long double x, int n) {
829 $abstract long double SCALBLNL(long double x, int n);
830
831 return SCALBLNL(x, n);
832}
833
834double cbrt(double x) {
835 $abstract double CBRT(double x);
836
837 return CBRT(x);
838}
839
840float cbrtf(float x) {
841 $abstract float CBRTF(float x);
842
843 return CBRTF(x);
844}
845
846long double cbrtl(long double x) {
847 $abstract long double CBRTL(long double x);
848
849 return CBRTL(x);
850}
851
852double fabs(double x) {
[07b891c]853 $abstract double FABS(double x);
854 double result = FABS(x);
855
856#ifdef MATH_ELABORATE_ASSUMPTIONS
[869af89]857 if(x >= 0)
[9e6785d]858 return x;
[869af89]859 else
860 return -x;
[07b891c]861#elif defined(MATH_NO_ASSUMPTIONS)
862 return result;
[9ce3b56]863#else
[3ff27cf]864 $assume((x >= 0 => result == x) && (x < 0 => result == -x));
[07b891c]865 return result;
[9ce3b56]866#endif
[869af89]867}
868
869float fabsf(float x) {
[07b891c]870 $abstract float FABSF(float x);
871 float result = FABSF(x);
872
873#ifdef MATH_ELABORATE_ASSUMPTIONS
[869af89]874 if(x >= 0)
875 return x;
876 else
877 return -x;
[07b891c]878#elif defined(MATH_NO_ASSUMPTIONS)
879 return result;
[9ce3b56]880#else
[3ff27cf]881 $assume((x >= 0 => result == x) && (x < 0 => result == -x));
[07b891c]882 return result;
[9ce3b56]883#endif
[869af89]884}
885
886long double fabsl(long double x) {
[07b891c]887 $abstract long double FABSL(long double x);
888 long double result = FABSL(x);
889
890#ifdef MATH_ELABORATE_ASSUMPTIONS
[869af89]891 if(x >= 0)
892 return x;
893 else
894 return -x;
[07b891c]895#elif defined(MATH_NO_ASSUMPTIONS)
896 return result;
[9ce3b56]897#else
[3ff27cf]898 $assume((x >= 0 => result == x) && (x < 0 => result == -x));
[07b891c]899 return result;
[9ce3b56]900#endif
[869af89]901}
902
903double sqrt(double x) {
[3ff27cf]904 $assert(x >= 0, "Argument x should be greater than 0.");
[65f112b]905 return $pow(x, 0.5);
[869af89]906}
907
908float sqrtf(float x) {
[3ff27cf]909 $assert(x >= 0, "Argument x should be greater than 0.");
[65f112b]910 return $pow(x, 0.5);
[869af89]911}
912
913long double sqrtl(long double x) {
[3ff27cf]914 $assert(x >= 0, "Argument x should be greater than 0.");
[65f112b]915 return $pow(x, 0.5);
[869af89]916}
917
918double hypot(double x, double y) {
919 double xsqrPLUSysqr = x*x + y*y;
920
921 return sqrt(xsqrPLUSysqr);
922}
923
924float hypotf(float x, float y) {
925 double xsqrPLUSysqr = x*x + y*y;
926
927 return sqrtf(xsqrPLUSysqr);
928}
929
930long double hypotl(long double x, long double y) {
931 double xsqrPLUSysqr = x*x + y*y;
932
933 return sqrtl(xsqrPLUSysqr);
934}
935
936double pow(double x, double y) {
[6157530]937 $assert(x != 0 || y > 0, "It's invalid that argument x "
938 "is 0 and y is no greater than 0.");
939 return $pow(x, y);
[869af89]940}
941
942float powf(float x, float y) {
[3ff27cf]943 $assert(x != 0 || y > 0, "It's invalid that argument x "
[6157530]944 "is 0 and y is no greater than 0.");
945 return $pow(x, y);
[869af89]946}
947
948long double powl(long double x, long double y) {
[3ff27cf]949 $assert(x != 0 || y > 0, "It's invalid that argument x "
[6157530]950 "is 0 and y is no greater than 0.");
951 return $pow(x, y);
[869af89]952}
953
954double erf(double x) {
955 $abstract double ERF(double x);
956
957 return ERF(x);
958}
959
960float erff(float x) {
961 $abstract float ERFF(float x);
962
963 return ERFF(x);
964}
965
966long double erfl(long double x) {
967 $abstract long double ERFL(long double x);
968
969 return ERFL(x);
970}
971
972double erfc(double x) {
973 $abstract double ERFC(double x);
974
975 return ERFC(x);
976}
977
978float erfcf(float x) {
979 $abstract float ERFCF(float x);
980
981 return ERFCF(x);
982}
983
984long double erfcl(long double x) {
985 $abstract long double ERFCL(long double x);
986
987 return ERFCL(x);
988}
989
990double lgamma(double x) {
991 $abstract double LGAMMA(double x);
992
[3ff27cf]993 $assert((x > 0), "Argument x should be greater than 0");
[869af89]994 return LGAMMA(x);
995}
996
997float lgammaf(float x) {
998 $abstract float LGAMMAF(float x);
999
[3ff27cf]1000 $assert((x > 0), "Argument x should be greater than 0");
[869af89]1001 return LGAMMAF(x);
1002}
1003
1004long double lgammal(long double x) {
1005 $abstract long double LGAMMAL(long double x);
1006
[3ff27cf]1007 $assert((x > 0), "Argument x should be greater than 0");
[869af89]1008 return LGAMMAL(x);
1009}
1010
1011double tgamma(double x) {
1012 $abstract double TGAMMA(double x);
1013
[3ff27cf]1014 $assert((x > 0), "Argument x should be greater than 0");
[869af89]1015 return TGAMMA(x);
1016}
1017
1018float tgammaf(float x) {
1019 $abstract float TGAMMAF(float x);
1020
[3ff27cf]1021 $assert((x > 0), "Argument x should be greater than 0");
[869af89]1022 return TGAMMAF(x);
1023}
1024
1025long double tgammal(long double x) {
1026 $abstract long double TGAMMAL(long double x);
1027
[3ff27cf]1028 $assert((x > 0), "Argument x should be greater than 0");
[869af89]1029 return TGAMMAL(x);
[9e6785d]1030}
1031
[f031e19]1032/* System functions
[869af89]1033double ceil(double x) {
1034 $abstract double CEIL(double x);
1035
[3ff27cf]1036 $assume(CEIL(x) >= x && CEIL(x) < (x + 1));
[f031e19]1037 $assume(x < 0 => (int)CEIL(x) == (int)x);
1038 $assume(CEIL(0) == (int)0);
[869af89]1039 return CEIL(x);
1040}
1041
1042float ceilf(float x) {
1043 $abstract float CEILF(float x);
1044
[3ff27cf]1045 $assume(CEILF(x) >= x && CEILF(x) < (x + 1));
[869af89]1046 return CEILF(x);
1047}
1048
1049long double ceill(long double x) {
1050 $abstract long double CEILL(long double x);
1051
[3ff27cf]1052 $assume(CEILL(x) >= x && CEILL(x) < (x + 1));
[869af89]1053 return CEILL(x);
1054}
1055
1056double floor(double x) {
1057 $abstract double FLOOR(double x);
1058
[3ff27cf]1059 $assume(FLOOR(x) <= x && FLOOR(x) > (x - 1));
[f031e19]1060 $assume(x > 0 => (int)FLOOR(x) == (int)x);
1061 $assume(FLOOR(0) == (int)0);
[869af89]1062 return FLOOR(x);
1063}
1064
1065float floorf(float x) {
1066 $abstract float FLOORF(float x);
1067
[3ff27cf]1068 $assume(FLOORF(x) <= x && FLOORF(x) > (x - 1));
[869af89]1069 return FLOORF(x);
1070}
1071
1072long double floorl(long double x) {
1073 $abstract long double FLOORL(long double x);
1074
[3ff27cf]1075 $assume(FLOORL(x) <= x && FLOORL(x) > (x - 1));
[869af89]1076 return FLOORL(x);
[f031e19]1077 }*/
[869af89]1078
1079double nearbyint(double x) {
1080 $abstract double NEARBYINT(double x);
1081
[3ff27cf]1082 $assume(NEARBYINT(x) < (x+1) && NEARBYINT(x) > (x-1));
[869af89]1083 return NEARBYINT(x);
1084}
1085
1086float nearbyintf(float x) {
1087 $abstract float NEARBYINTF(float x);
1088
[3ff27cf]1089 $assume(NEARBYINTF(x) < (x+1) && NEARBYINTF(x) > (x-1));
[869af89]1090 return NEARBYINTF(x);
1091}
1092
1093long double nearbyintl(long double x) {
1094 $abstract long double NEARBYINTL(long double x);
1095
[3ff27cf]1096 $assume(NEARBYINTL(x) < (x+1) && NEARBYINTL(x) > (x-1));
[869af89]1097 return NEARBYINTL(x);
1098}
1099
1100double rint(double x) {
1101 $abstract double RINT(double x);
1102
[3ff27cf]1103 $assume(RINT(x) < (x+1) && RINT(x) > (x-1));
[869af89]1104 return RINT(x);
1105}
1106
1107float rintf(float x) {
1108 $abstract float RINTF(float x);
1109
[3ff27cf]1110 $assume(RINTF(x) < (x+1) && RINTF(x) > (x-1));
[869af89]1111 return RINTF(x);
1112}
1113
1114long double rintl(long double x) {
1115 $abstract long double RINTL(long double x);
1116
[3ff27cf]1117 $assume(RINTL(x) < (x+1) && RINTL(x) > (x-1));
[869af89]1118 return RINTL(x);
1119}
1120
1121long int lrint(double x) {
1122 $abstract long int LRINT(double x);
1123
[3ff27cf]1124 $assume(LRINT(x) < (x+1) && LRINT(x) > (x-1));
[869af89]1125 return LRINT(x);
1126}
1127
1128long int lrintf(float x) {
1129 $abstract long int LRINTF(float x);
1130
[3ff27cf]1131 $assume(LRINTF(x) < (x+1) && LRINTF(x) > (x-1));
[869af89]1132 return LRINTF(x);
1133}
1134
1135long int lrintl(long double x) {
1136 $abstract long int LRINTL(long double x);
1137
[3ff27cf]1138 $assume(LRINTL(x) < (x+1) && LRINTL(x) > (x-1));
[869af89]1139 return LRINTL(x);
1140}
1141
1142long long int llrint(double x) {
1143 $abstract long long int LLRINT(double x);
1144
[3ff27cf]1145 $assume(LLRINT(x) < (x+1) && LLRINT(x) > (x-1));
[869af89]1146 return LLRINT(x);
1147}
1148
1149long long int llrintf(float x) {
1150 $abstract long long int LLRINTF(float x);
1151
[3ff27cf]1152 $assume(LLRINTF(x) < (x+1) && LLRINTF(x) > (x-1));
[869af89]1153 return LLRINTF(x);
1154}
1155
1156long long int llrintl(long double x) {
1157 $abstract long long int LLRINTL(long double x);
1158
[3ff27cf]1159 $assume(LLRINTL(x) < (x+1) && LLRINTL(x) > (x-1));
[869af89]1160 return LLRINTL(x);
1161}
1162
1163double round(double x) {
1164 $abstract double ROUND(double x);
1165
[3ff27cf]1166 $assume(ROUND(x) < (x+1) && ROUND(x) > (x-1));
[869af89]1167 return ROUND(x);
1168}
1169
1170float roundf(float x) {
1171 $abstract float ROUNDF(float x);
1172
[3ff27cf]1173 $assume(ROUNDF(x) < (x+1) && ROUNDF(x) > (x-1));
[869af89]1174 return ROUNDF(x);
1175}
1176
1177long double roundl(long double x) {
1178 $abstract long double ROUNDL(long double x);
1179
[3ff27cf]1180 $assume(ROUNDL(x) < (x+1) && ROUNDL(x) > (x-1));
[869af89]1181 return ROUNDL(x);
1182}
1183
1184long int lround(double x) {
1185 $abstract long int LROUND(double x);
1186
[3ff27cf]1187 $assume(LROUND(x) < (x+1) && LROUND(x) > (x-1));
[869af89]1188 return LROUND(x);
1189}
1190
1191long int lroundf(float x) {
1192 $abstract long int LROUNDF(float x);
1193
[3ff27cf]1194 $assume(LROUNDF(x) < (x+1) && LROUNDF(x) > (x-1));
[869af89]1195 return LROUNDF(x);
1196}
1197
1198long int lroundl(long double x) {
1199 $abstract long int LROUNDL(long double x);
1200
[3ff27cf]1201 $assume(LROUNDL(x) < (x+1) && LROUNDL(x) > (x-1));
[869af89]1202 return LROUNDL(x);
1203}
1204
1205long long int llround(double x) {
1206 $abstract long long int LLROUND(double x);
1207
[3ff27cf]1208 $assume(LLROUND(x) < (x+1) && LLROUND(x) > (x-1));
[869af89]1209 return LLROUND(x);
1210}
1211
1212long long int llroundf(float x) {
1213 $abstract long long int LLROUNDF(float x);
1214
[3ff27cf]1215 $assume(LLROUNDF(x) < (x+1) && LLROUNDF(x) > (x-1));
[869af89]1216 return LLROUNDF(x);
1217}
1218
1219long long int llroundl(long double x) {
1220 $abstract long long int LLROUNDL(long double x);
1221
[3ff27cf]1222 $assume(LLROUNDL(x) < (x+1) && LLROUNDL(x) > (x-1));
[869af89]1223 return LLROUNDL(x);
1224}
1225
1226double trunc(double x) {
1227 $abstract double TRUNC(double x);
1228
[3ff27cf]1229 $assume(TRUNC(x) < (x) && TRUNC(x) > (x-1));
[869af89]1230 return TRUNC(x);
1231}
1232
1233float truncf(float x) {
1234 $abstract float TRUNCF(float x);
1235
[3ff27cf]1236 $assume(TRUNCF(x) < (x) && TRUNCF(x) > (x-1));
[869af89]1237 return TRUNCF(x);
1238}
1239
1240long double truncl(long double x) {
1241 $abstract long double TRUNCL(long double x);
1242
[3ff27cf]1243 $assume(TRUNCL(x) < (x) && TRUNCL(x) > (x-1));
[869af89]1244 return TRUNCL(x);
1245}
1246
1247double fmod(double x, double y) {
1248 $abstract double FMOD(double x, double y);
1249
[3ff27cf]1250 $assert(y != 0, "Argument y should not be 0");
[869af89]1251 return FMOD(x,y);
1252}
1253
1254float fmodf(float x, float y) {
1255 $abstract float FMODF(float x, float y);
1256
[3ff27cf]1257 $assert(y != 0, "Argument y should not be 0");
[869af89]1258 return FMODF(x,y);
1259}
1260
1261long double fmodl(long double x, long double y) {
1262 $abstract long double FMODL(long double x, long double y);
1263
[3ff27cf]1264 $assert(y != 0, "Argument y should not be 0");
[869af89]1265 return FMODL(x,y);
1266}
1267
1268double remainder(double x, double y) {
1269 $abstract double REMAINDER(double x, double y);
1270
[3ff27cf]1271 $assert(y != 0, "Argument y should not be 0");
[869af89]1272 return REMAINDER(x,y);
1273}
1274
1275float remainderf(float x, float y) {
1276 $abstract float REMAINDERF(float x, float y);
1277
[3ff27cf]1278 $assert(y != 0, "Argument y should not be 0");
[869af89]1279 return REMAINDERF(x,y);
1280}
1281
1282long double remainderl(long double x, long double y) {
1283 $abstract long double REMAINDERL(long double x, long double y);
1284
[3ff27cf]1285 $assert(y != 0, "Argument y should not be 0");
[869af89]1286 return REMAINDERL(x,y);
1287}
1288
1289
1290double remquo(double x, double y, int *quo) {
1291 $abstract double REMQUO(double x, double y);
1292 $abstract int REMQUO_QUO(double x, double y);
1293
[3ff27cf]1294 $assert(y != 0, "Argument y should not be 0");
[869af89]1295 (*quo) = REMQUO_QUO(x, y);
1296 return REMQUO(x,y);
1297}
1298
1299float remquof(float x, float y, int *quo) {
1300 $abstract float REMQUOF(float x, float y);
1301 $abstract int REMQUOF_QUO(float x, float y);
1302
[3ff27cf]1303 $assert(y != 0, "Argument y should not be 0");
[869af89]1304 (*quo) = REMQUOF_QUO(x, y);
1305 return REMQUOF(x,y);
1306}
1307
1308long double remquol(long double x, long double y, int *quo) {
1309 $abstract long double REMQUOL(long double x, long double y);
1310 $abstract int REMQUOL_QUO(long double x, long double y);
1311
[3ff27cf]1312 $assert(y != 0, "Argument y should not be 0");
[869af89]1313 (*quo) = REMQUOL_QUO(x, y);
1314 return REMQUOL(x,y);
1315}
1316
1317double copysign(double x, double y) {
1318 $abstract double COPYSIGN(double x, double y);
1319
1320 return COPYSIGN(x,y);
1321}
1322
1323float copysignf(float x, float y) {
1324 $abstract float COPYSIGNF(float x, float y);
1325
1326 return COPYSIGNF(x,y);
1327}
1328
1329long double copysignl(long double x, long double y) {
1330 $abstract long double COPYSIGNL(long double x, long double y);
1331
1332 return COPYSIGNL(x,y);
1333}
1334
1335double nan(const char *tagp) {
[f0296bc8]1336 // changed by sfsiegel from NAN to CNAN
1337 // since NAN is already used
1338 $abstract double CNAN(const char *tagp);
[869af89]1339
[f0296bc8]1340 return CNAN(tagp);
[869af89]1341}
1342
1343float nanf(const char *tagp) {
1344 $abstract float NANF(const char *tagp);
1345
1346 return NANF(tagp);
1347}
1348
1349long double nanl(const char *tagp) {
1350 $abstract long double NANL(const char *tagp);
1351
1352 return NANL(tagp);
1353}
1354
1355double nextafter(double x, double y) {
1356 $abstract double NEXTAFTER(double x, double y);
1357
1358 return NEXTAFTER(x,y);
1359}
1360
1361float nextafterf(float x, float y) {
1362 $abstract float NEXTAFTERF(float x, float y);
1363
1364 return NEXTAFTERF(x,y);
1365}
1366
1367long double nextafterl(long double x, long double y) {
1368 $abstract long double NEXTAFTERL(long double x, long double y);
1369
1370 return NEXTAFTERL(x,y);
1371}
1372
1373double nexttoward(double x, long double y) {
1374 $abstract double NEXTTOWARD(double x, long double y);
1375
1376 return NEXTTOWARD(x,y);
1377}
1378
1379float nexttowardf(float x, long double y) {
1380 $abstract float NEXTTOWARDF(float x, long double y);
1381
1382 return NEXTTOWARDF(x,y);
1383}
1384
1385long double nexttowardl(long double x, long double y) {
1386 $abstract long double NEXTTOWARDL(long double x, long double y);
1387
1388 return NEXTTOWARDL(x,y);
1389}
1390
1391double fdim(double x, double y) {
1392 return (x>y)?(x-y):0;
1393}
1394
1395float fdimf(float x, float y) {
1396 return (x>y)?(x-y):0;
1397}
1398
1399long double fdiml(long double x, long double y) {
1400 return (x>y)?(x-y):0;
1401}
1402
1403double fmax(double x, double y) {
1404 return (x>y)?(x):(y);
1405}
1406
1407float fmaxf(float x, float y) {
1408 return (x>y)?(x):(y);
1409}
1410
1411long double fmaxl(long double x, long double y) {
1412 return (x>y)?(x):(y);
1413}
1414
1415double fmin(double x, double y) {
1416 return (x<y)?(x):(y);
1417}
1418
1419float fminf(float x, float y) {
1420 return (x<y)?(x):(y);
1421}
1422
1423long double fminl(long double x, long double y) {
1424 return (x<y)?(x):(y);
1425}
1426
1427double fma(double x, double y, double z) {
1428 $abstract double FMA(double x, double y, double z);
1429
1430 return FMA(x,y,z);
1431}
1432
1433float fmaf(float x, float y, float z) {
1434 $abstract float FMAF(float x, float y, float z);
1435
1436 return FMAF(x,y,z);
1437}
1438
1439long double fmal(long double x, long double y, long double z) {
1440 $abstract long double FMAL(long double x,
1441 long double y, long double z);
1442
1443 return FMAL(x,y,z);
1444}
1445
[9e6785d]1446#endif
[869af89]1447
1448
Note: See TracBrowser for help on using the repository browser.