source: CIVL/src/include/civl/math.cvl@ e55b458

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since e55b458 was 3ff27cf, checked in by Manchun Zheng <zmanchun@…>, 11 years ago

updated examples since $assert/$assume has been changed to functions; fixed the model builder for the new side-effect remover.

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

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