source: CIVL/src/include/civl/math.cvl@ 19bdca2

1.23 2.0 main test-branch
Last change on this file since 19bdca2 was bf584ca, checked in by Manchun Zheng <zmanchun@…>, 11 years ago

cleaned up #ifdef ... #else of headers using #ifndef.

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

  • Property mode set to 100644
File size: 31.2 KB
Line 
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 */
10
11#ifndef __CIVL_MATH__
12#define __CIVL_MATH__
13#include <civlc.cvh>
14#include <math.h>
15
16double acos(double x) {
17 $abstract double ACOS(double X);
18 double result;
19
20 $assert(-1 <= x && x <=1, "Argument x should be in interval[-1, 1]");
21 result = ACOS(x);
22#ifdef MATH_ELABORATE_ASSUMPTIONS
23 if(x == 1)
24 return 0;
25 else {
26 $assume(result > 0);
27 return result;
28 }
29#elif defined(MATH_NO_ASSUMPTIONS)
30 return result;
31#else
32 $assume(((x == 1 => result == 0) && (x != 1 => result > 0)));
33 return result;
34#endif
35}
36
37float acosf(float x) {
38 $abstract float ACOSF(float X);
39 double result;
40
41 $assert(-1 <= x && x <=1, "Argument x should be in interval[-1, 1]");
42 result = ACOSF(x);
43#ifdef MATH_ELABORATE_ASSUMPTIONS
44 if(x == 1)
45 return 0;
46 else {
47 $assume(result > 0);
48 return result;
49 }
50#elif defined(MATH_NO_ASSUMPTIONS)
51 return result;
52#else
53 $assume(((x == 1 => result == 0) && (x != 1 => result > 0)));
54 return result;
55#endif
56}
57
58long double acosl(long double x) {
59 $abstract long double ACOSL(long double X);
60 double result;
61
62 $assert(-1 <= x && x <=1, "Argument x should be in interval[-1, 1]");
63 result = ACOSL(x);
64#ifdef MATH_ELABORATE_ASSUMPTIONS
65 if(x == 1)
66 return 0;
67 else {
68 $assume(result > 0);
69 return result;
70 }
71#elif defined(MATH_NO_ASSUMPTIONS)
72 return result;
73#else
74 $assume(((x == 1 => result == 0) && (x != 1 => result > 0)));
75 return result;
76#endif
77}
78
79double asin(double x) {
80 $abstract double ASIN(double X);
81
82 $assert(-1 <= x && x <= 1);
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
90 $assert(-1 <= x && x <= 1);
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
98 $assert(-1 <= x && x <= 1);
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
121 $assert(x!=0 || y !=0, "Arguments x and y"
122 "should not be both 0");
123 return ATAN2(x, y);
124}
125
126float atan2f(float x, float y) {
127 $abstract float ATAN2F(float X, float Y);
128
129 $assert(x!=0.0 || y !=0.0, "Arguments x and y should not be both 0");
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
137 $assert(x!=0.0 || y !=0.0, "Arguments x and y should not be both 0");
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
198 $assert(x >= 1, "Argument x should not less than 1.");
199 return ACOSH(x);
200}
201
202float acoshf(float x) {
203 $abstract float ACOSHF(float X);
204
205 $assert(x >= 1, "Argument x should not less than 1.");
206 return ACOSHF(x);
207}
208
209long double acoshl(long double x) {
210 $abstract long double ACOSHL(long double X);
211
212 $assert(x >= 1, "Argument x should not less than 1.");
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
237 $assert(-1 < x && x < 1, "Argument x should be in the interval (-1, 1)");
238 return ATANH(x);
239}
240
241float atanhf(float x) {
242 $abstract float ATANHF(float X);
243
244 $assert(-1 < x && x < 1, "Argument x should be in the interval (-1, 1)");
245 return ATANHF(x);
246}
247
248long double atanhl(long double x) {
249 $abstract long double ATANHL(long double X);
250
251 $assert(-1 < x && x < 1, "Argument x should be in the interval (-1, 1)");
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}
272
273double sinh(double x) {
274 $abstract double SINH(double X);
275
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);
293
294 return TANH(x);
295}
296
297float tanhf(float x) {
298 $abstract float TANHF(float X);
299
300 return TANHF(x);
301}
302
303long double tanhl(long double x) {
304 $abstract long double TANHL(long double X);
305
306 return TANHL(x);
307}
308
309double exp(double x) {
310 $abstract double EXP(double X);
311 double result = EXP(x);
312
313#ifdef MATH_ELABORATE_ASSUMPTIONS
314 if(x == 0)
315 return 1;
316 else {
317 $assume(result > 0);
318 return result;
319 }
320#elif defined(MATH_NO_ASSUMPTIONS)
321 return result;
322#else
323 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
324 return result;
325#endif
326}
327
328float expf(float x) {
329 $abstract float EXPF(float X);
330 double result = EXPF(x);
331
332#ifdef MATH_ELABORATE_ASSUMPTIONS
333 if(x == 0)
334 return 1;
335 else {
336 $assume(result > 0 );
337 return result;
338 }
339#elif defined(MATH_NO_ASSUMPTIONS)
340 return result;
341#else
342 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
343 return result;
344#endif
345}
346
347long double expl(long double x) {
348 $abstract long double EXPL(long double X);
349 double result = EXPL(x);
350
351#ifdef MATH_ELABORATE_ASSUMPTIONS
352 if(x == 0)
353 return 1;
354 else {
355 $assume(result > 0 );
356 return result;
357 }
358#elif defined(MATH_NO_ASSUMPTIONS)
359 return result;
360#else
361 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
362 return result;
363#endif
364}
365
366double exp2(double x) {
367 $abstract double EXP2(double X);
368 double result = EXP2(x);
369
370#ifdef MATH_ELABORATE_ASSUMPTIONS
371 if(x == 0)
372 return 1;
373 else {
374 $assume(result > 0 );
375 return result;
376 }
377#elif defined(MATH_NO_ASSUMPTIONS)
378 return result;
379#else
380 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
381 return result;
382#endif
383}
384
385float exp2f(float x) {
386 $abstract float EXP2F(float X);
387 double result = EXP2F(x);
388
389#ifdef MATH_ELABORATE_ASSUMPTIONS
390 if(x == 0)
391 return 1;
392 else {
393 $assume(result > 0 );
394 return result;
395 }
396#elif defined(MATH_NO_ASSUMPTIONS)
397 return result;
398#else
399 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
400 return result;
401#endif
402}
403
404long double exp2l(long double x) {
405 $abstract long double EXP2L(long double X);
406 double result = EXP2L(x);
407
408#ifdef MATH_ELABORATE_ASSUMPTIONS
409 if(x == 0)
410 return 1;
411 else {
412 $assume(result > 0 );
413 return result;
414 }
415#elif defined(MATH_NO_ASSUMPTIONS)
416 return result;
417#else
418 $assume(((x==0 => result == 1) && (x!=0 => result > 0)));
419 return result;
420#endif
421}
422
423double expm1(double x) {
424 $abstract double EXPM1(double X);
425 double result = EXPM1(x);
426
427#ifdef MATH_ELABORATE_ASSUMPTIONS
428 if(x == 0)
429 return 0;
430 else {
431 $assume(result > -1);
432 return result;
433 }
434#elif defined(MATH_NO_ASSUMPTIONS)
435 return result;
436#else
437 $assume(((x==0 => result == 0) && (x!=0 => result > -1)));
438 return result;
439#endif
440}
441
442float expm1f(float x) {
443 $abstract float EXPM1F(float X);
444 double result = EXPM1F(x);
445
446#ifdef MATH_ELABORATE_ASSUMPTIONS
447 if(x == 0)
448 return 0;
449 else {
450 $assume(result > -1);
451 return result;
452 }
453#elif defined(MATH_NO_ASSUMPTIONS)
454 return result;
455#else
456 $assume(((x==0 => result == 0) && (x!=0 => result > -1)));
457 return result;
458#endif
459}
460
461long double expm1l(long double x) {
462 $abstract long double EXPM1L(long double X);
463 double result = EXPM1L(x);
464
465#ifdef MATH_ELABORATE_ASSUMPTIONS
466 if(x == 0)
467 return 0;
468 else {
469 $assume(result > -1);
470 return result;
471 }
472#elif defined(MATH_NO_ASSUMPTIONS)
473 return result;
474#else
475 $assume(((x==0 => result == 0) && (x!=0 => result > -1)));
476 return result;
477#endif
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);
485 $assume((FREXP_X(x) >= 1/2 && FREXP_X(x) < 1) ||
486 FREXP_X(x) == 0);
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);
495 $assume((FREXPF_X(x) >= 1/2 && FREXPF_X(x) < 1) ||
496 FREXPF_X(x) == 0);
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);
505 $assume((FREXPL_X(x) >= 1/2 && FREXPL_X(x) < 1) ||
506 FREXPL_X(x) == 0);
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.
514 $assert(x != 0, "Argument x cannot be zero.");
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.
522 $assert(x != 0, "Argument x cannot be zero.");
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.
530 $assert(x != 0, "Argument x cannot be zero.");
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);
554 double result = LOG(x);
555
556 $assert(x > 0, "Argument x should be greater than 0");
557#ifdef MATH_ELABORATE_ASSUMPTIONS
558 if(x == 1)
559 return 0;
560 else {
561 $assume(result != 0);
562 return result;
563 }
564#elif defined(MATH_NO_ASSUMPTIONS)
565 return result;
566#else
567 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
568 return result;
569#endif
570}
571
572float logf(float x) {
573 $abstract float LOGF(float X);
574 float result = LOGF(x);
575
576 $assert(x > 0, "Argument x should be greater than 0");
577#ifdef MATH_ELABORATE_ASSUMPTIONS
578 if(x == 1)
579 return 0;
580 else {
581 $assume(result != 0);
582 return result;
583 }
584#elif defined(MATH_NO_ASSUMPTIONS)
585 return result;
586#else
587 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
588 return result;
589#endif
590}
591
592long double logl(long double x) {
593 $abstract long double LOGL(long double X);
594 long double result = LOGL(x);
595
596 $assert(x > 0, "Argument x should be greater than 0");
597#ifdef MATH_ELABORATE_ASSUMPTIONS
598 if(x == 1)
599 return 0;
600 else {
601 $assume(result != 0);
602 return result;
603 }
604#elif defined(MATH_NO_ASSUMPTIONS)
605 return result;
606#else
607 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
608 return result;
609#endif
610}
611
612double log10(double x) {
613 $abstract double LOG10(double X);
614 double result = LOG10(x);
615
616 $assert(x > 0, "Argument x should be greater than 0");
617#ifdef MATH_ELABORATE_ASSUMPTIONS
618 if(x == 1)
619 return 0;
620 else {
621 $assume(result != 0);
622 return result;
623 }
624#elif defined(MATH_NO_ASSUMPTIONS)
625 return result;
626#else
627 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
628 return result;
629#endif
630}
631
632float log10f(float x) {
633 $abstract float LOG10F(float X);
634 float result = LOG10F(x);
635
636 $assert(x > 0, "Argument x should be greater than 0");
637#ifdef MATH_ELABORATE_ASSUMPTIONS
638 if(x == 1)
639 return 0;
640 else {
641 $assume(result != 0);
642 return result;
643 }
644#elif defined(MATH_NO_ASSUMPTIONS)
645 return result;
646#else
647 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
648 return result;
649#endif
650}
651
652long double log10l(long double x) {
653 $abstract long double LOG10L(long double X);
654 long double result = LOG10L(x);
655
656 $assert(x > 0, "Argument x should be greater than 0");
657#ifdef MATH_ELABORATE_ASSUMPTIONS
658 if(x == 1)
659 return 0;
660 else {
661 $assume(result != 0);
662 return result;
663 }
664#elif defined(MATH_NO_ASSUMPTIONS)
665 return result;
666#else
667 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
668 return result;
669#endif
670}
671
672double log1p(double x) {
673 $abstract double LOG1P(double X);
674
675 $assert(x > -1, "Argument x should be greater than -1");
676 return LOG1P(x);
677}
678
679float log1pf(float x) {
680 $abstract float LOG1PF(float X);
681
682 $assert(x > -1, "Argument x should be greater than -1");
683 return LOG1PF(x);
684}
685
686long double log1pl(long double x) {
687 $abstract long double LOG1PL(long double X);
688
689 $assert(x > -1, "Argument x should be greater than -1");
690 return LOG1PL(x);
691}
692
693double log2(double x) {
694 $abstract double LOG2(double X);
695 double result = LOG2(x);
696
697 $assert(x > 0, "Argument x should be greater than 0");
698#ifdef MATH_ELABORATE_ASSUMPTIONS
699 if(x == 1)
700 return 0;
701 else {
702 $assume(result != 0);
703 return result;
704 }
705#elif defined(MATH_NO_ASSUMPTIONS)
706 return result;
707#else
708 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
709 return result;
710#endif
711}
712
713float log2f(float x) {
714 $abstract float LOG2F(float X);
715 float result = LOG2F(x);
716
717 $assert(x > 0, "Argument x should be greater than 0");
718 #ifdef MATH_ELABORATE_ASSUMPTIONS
719 if(x == 1)
720 return 0;
721 else {
722 $assume(result != 0);
723 return result;
724 }
725#elif defined(MATH_NO_ASSUMPTIONS)
726 return result;
727#else
728 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
729 return result;
730#endif
731}
732
733long double log2l(long double x) {
734 $abstract long double LOG2L(long double X);
735 long double result = LOG2L(x);
736
737 $assert(x > 0, "Argument x should be greater than 0");
738#ifdef MATH_ELABORATE_ASSUMPTIONS
739 if(x == 1)
740 return 0;
741 else {
742 $assume(result != 0);
743 return result;
744 }
745#elif defined(MATH_NO_ASSUMPTIONS)
746 return result;
747#else
748 $assume(((x==1) => (result==0)) && ((x!=1) => (result!=0)));
749 return result;
750#endif
751}
752
753double logb(double x) {
754 $abstract double LOGB(double X);
755
756 $assert(x != 0, "Argument x should not equal to 0");
757 return LOGB(x);
758}
759
760float logbf(float x) {
761 $abstract float LOGBF(float X);
762
763 $assert(x != 0, "Argument x should not equal to 0");
764 return LOGBF(x);
765}
766
767long double logbl(long double x) {
768 $abstract long double LOGBL(long double X);
769
770 $assert(x != 0, "Argument x should not equal to 0");
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) {
853 $abstract double FABS(double x);
854 double result = FABS(x);
855
856#ifdef MATH_ELABORATE_ASSUMPTIONS
857 if(x >= 0)
858 return x;
859 else
860 return -x;
861#elif defined(MATH_NO_ASSUMPTIONS)
862 return result;
863#else
864 $assume((x >= 0 => result == x) && (x < 0 => result == -x));
865 return result;
866#endif
867}
868
869float fabsf(float x) {
870 $abstract float FABSF(float x);
871 float result = FABSF(x);
872
873#ifdef MATH_ELABORATE_ASSUMPTIONS
874 if(x >= 0)
875 return x;
876 else
877 return -x;
878#elif defined(MATH_NO_ASSUMPTIONS)
879 return result;
880#else
881 $assume((x >= 0 => result == x) && (x < 0 => result == -x));
882 return result;
883#endif
884}
885
886long double fabsl(long double x) {
887 $abstract long double FABSL(long double x);
888 long double result = FABSL(x);
889
890#ifdef MATH_ELABORATE_ASSUMPTIONS
891 if(x >= 0)
892 return x;
893 else
894 return -x;
895#elif defined(MATH_NO_ASSUMPTIONS)
896 return result;
897#else
898 $assume((x >= 0 => result == x) && (x < 0 => result == -x));
899 return result;
900#endif
901}
902
903double sqrt(double x) {
904 $abstract double SQRT(double x);
905 double result;
906
907 $assert(x >= 0, "Argument x should be greater than 0.");
908 result = SQRT(x);
909#ifdef MATH_ELABORATE_ASSUMPTIONS
910 if(x == 0)
911 return 0;
912 else {
913 $assume(result > 0);
914 return result;
915 }
916#elif defined(MATH_NO_ASSUMPTIONS)
917 return result;
918#else
919 $assume((x == 0 => result == 0) && (x > 0 => result > 0));
920 return result;
921#endif
922}
923
924float sqrtf(float x) {
925 $abstract float SQRTF(float x);
926 double result;
927
928 $assert(x >= 0, "Argument x should be greater than 0.");
929 result = SQRTF(x);
930#ifdef MATH_ELABORATE_ASSUMPTIONS
931 if(x == 0)
932 return 0;
933 else {
934 $assume(result > 0);
935 return result;
936 }
937#elif defined(MATH_NO_ASSUMPTIONS)
938 return result;
939#else
940 $assume((x == 0 => result == 0) && (x > 0 => result > 0));
941 return result;
942#endif
943}
944
945long double sqrtl(long double x) {
946 $abstract long double SQRTL(long double x);
947 double result;
948
949 $assert(x >= 0, "Argument x should be greater than 0.");
950 result = SQRTL(x);
951#ifdef MATH_ELABORATE_ASSUMPTIONS
952 if(x == 0)
953 return 0;
954 else {
955 $assume(result > 0);
956 return result;
957 }
958#elif defined(MATH_NO_ASSUMPTIONS)
959 return result;
960#else
961 $assume((x == 0 => result == 0) && (x > 0 => result > 0));
962 return result;
963#endif
964}
965
966double hypot(double x, double y) {
967 double xsqrPLUSysqr = x*x + y*y;
968
969 return sqrt(xsqrPLUSysqr);
970}
971
972float hypotf(float x, float y) {
973 double xsqrPLUSysqr = x*x + y*y;
974
975 return sqrtf(xsqrPLUSysqr);
976}
977
978long double hypotl(long double x, long double y) {
979 double xsqrPLUSysqr = x*x + y*y;
980
981 return sqrtl(xsqrPLUSysqr);
982}
983
984double pow(double x, double y) {
985 $abstract double POW(double x, double y);
986 double result = POW(x,y);
987
988 $assert(x != 0 || y > 0, "It's invalid that argument x "
989 "is 0 and y is no greater than 0.");
990#ifdef MATH_ELABORATE_ASSUMPTIONS
991 if(x == 0)
992 return 0;
993 else if(x == 1)
994 return 1;
995 else if(y == 1)
996 return x;
997 else if(y == 0 && x != 0)
998 return 1;
999 else return result;
1000#elif defined(MATH_NO_ASSUMPTIONS)
1001 return result;
1002#else
1003 $assume((x==0 => result == 0) && (x==1 => result == 1)
1004 && (y==1 => result == x) && ((y==0 && x!=0) => result == 1));
1005 return result;
1006#endif
1007}
1008
1009float powf(float x, float y) {
1010 $abstract float POWF(float x, float y);
1011 float result = POWF(x, y);
1012
1013 $assert(x != 0 || y > 0, "It's invalid that argument x "
1014 "is 0 and y is no greater than 0.");
1015#ifdef MATH_ELABORATE_ASSUMPTIONS
1016 if(x == 0)
1017 return 0;
1018 else if(x == 1)
1019 return 1;
1020 else if(y == 1)
1021 return x;
1022 else if(y == 0 && x != 0)
1023 return 1;
1024 else return result;
1025#elif defined(MATH_NO_ASSUMPTIONS)
1026 return result;
1027#else
1028 $assume((x==0 => result == 0) && (x==1 => result == 1)
1029 && (y==1 => result == x) && ((y==0 && x!=0) => result == 1));
1030 return result;
1031#endif
1032}
1033
1034long double powl(long double x, long double y) {
1035 $abstract long double POWL(long double x,
1036 long double y);
1037 long double result = POWL(x, y);
1038 $assert(x != 0 || y > 0, "It's invalid that argument x "
1039 "is 0 and y is no greater than 0.");
1040#ifdef MATH_ELABORATE_ASSUMPTIONS
1041 if(x == 0)
1042 return 0;
1043 else if(x == 1)
1044 return 1;
1045 else if(y == 1)
1046 return x;
1047 else if(y == 0 && x != 0)
1048 return 1;
1049 else return result;
1050#elif defined(MATH_NO_ASSUMPTIONS)
1051 return result;
1052#else
1053 $assume((x==0 => result == 0) && (x==1 => result == 1)
1054 && (y==1 => result == x) && ((y==0 && x!=0) => result == 1));
1055 return result;
1056#endif
1057}
1058
1059double erf(double x) {
1060 $abstract double ERF(double x);
1061
1062 return ERF(x);
1063}
1064
1065float erff(float x) {
1066 $abstract float ERFF(float x);
1067
1068 return ERFF(x);
1069}
1070
1071long double erfl(long double x) {
1072 $abstract long double ERFL(long double x);
1073
1074 return ERFL(x);
1075}
1076
1077double erfc(double x) {
1078 $abstract double ERFC(double x);
1079
1080 return ERFC(x);
1081}
1082
1083float erfcf(float x) {
1084 $abstract float ERFCF(float x);
1085
1086 return ERFCF(x);
1087}
1088
1089long double erfcl(long double x) {
1090 $abstract long double ERFCL(long double x);
1091
1092 return ERFCL(x);
1093}
1094
1095double lgamma(double x) {
1096 $abstract double LGAMMA(double x);
1097
1098 $assert((x > 0), "Argument x should be greater than 0");
1099 return LGAMMA(x);
1100}
1101
1102float lgammaf(float x) {
1103 $abstract float LGAMMAF(float x);
1104
1105 $assert((x > 0), "Argument x should be greater than 0");
1106 return LGAMMAF(x);
1107}
1108
1109long double lgammal(long double x) {
1110 $abstract long double LGAMMAL(long double x);
1111
1112 $assert((x > 0), "Argument x should be greater than 0");
1113 return LGAMMAL(x);
1114}
1115
1116double tgamma(double x) {
1117 $abstract double TGAMMA(double x);
1118
1119 $assert((x > 0), "Argument x should be greater than 0");
1120 return TGAMMA(x);
1121}
1122
1123float tgammaf(float x) {
1124 $abstract float TGAMMAF(float x);
1125
1126 $assert((x > 0), "Argument x should be greater than 0");
1127 return TGAMMAF(x);
1128}
1129
1130long double tgammal(long double x) {
1131 $abstract long double TGAMMAL(long double x);
1132
1133 $assert((x > 0), "Argument x should be greater than 0");
1134 return TGAMMAL(x);
1135}
1136
1137double ceil(double x) {
1138 $abstract double CEIL(double x);
1139
1140 $assume(CEIL(x) >= x && CEIL(x) < (x + 1));
1141 return CEIL(x);
1142}
1143
1144float ceilf(float x) {
1145 $abstract float CEILF(float x);
1146
1147 $assume(CEILF(x) >= x && CEILF(x) < (x + 1));
1148 return CEILF(x);
1149}
1150
1151long double ceill(long double x) {
1152 $abstract long double CEILL(long double x);
1153
1154 $assume(CEILL(x) >= x && CEILL(x) < (x + 1));
1155 return CEILL(x);
1156}
1157
1158double floor(double x) {
1159 $abstract double FLOOR(double x);
1160
1161 $assume(FLOOR(x) <= x && FLOOR(x) > (x - 1));
1162 return FLOOR(x);
1163}
1164
1165float floorf(float x) {
1166 $abstract float FLOORF(float x);
1167
1168 $assume(FLOORF(x) <= x && FLOORF(x) > (x - 1));
1169 return FLOORF(x);
1170}
1171
1172long double floorl(long double x) {
1173 $abstract long double FLOORL(long double x);
1174
1175 $assume(FLOORL(x) <= x && FLOORL(x) > (x - 1));
1176 return FLOORL(x);
1177}
1178
1179double nearbyint(double x) {
1180 $abstract double NEARBYINT(double x);
1181
1182 $assume(NEARBYINT(x) < (x+1) && NEARBYINT(x) > (x-1));
1183 return NEARBYINT(x);
1184}
1185
1186float nearbyintf(float x) {
1187 $abstract float NEARBYINTF(float x);
1188
1189 $assume(NEARBYINTF(x) < (x+1) && NEARBYINTF(x) > (x-1));
1190 return NEARBYINTF(x);
1191}
1192
1193long double nearbyintl(long double x) {
1194 $abstract long double NEARBYINTL(long double x);
1195
1196 $assume(NEARBYINTL(x) < (x+1) && NEARBYINTL(x) > (x-1));
1197 return NEARBYINTL(x);
1198}
1199
1200double rint(double x) {
1201 $abstract double RINT(double x);
1202
1203 $assume(RINT(x) < (x+1) && RINT(x) > (x-1));
1204 return RINT(x);
1205}
1206
1207float rintf(float x) {
1208 $abstract float RINTF(float x);
1209
1210 $assume(RINTF(x) < (x+1) && RINTF(x) > (x-1));
1211 return RINTF(x);
1212}
1213
1214long double rintl(long double x) {
1215 $abstract long double RINTL(long double x);
1216
1217 $assume(RINTL(x) < (x+1) && RINTL(x) > (x-1));
1218 return RINTL(x);
1219}
1220
1221long int lrint(double x) {
1222 $abstract long int LRINT(double x);
1223
1224 $assume(LRINT(x) < (x+1) && LRINT(x) > (x-1));
1225 return LRINT(x);
1226}
1227
1228long int lrintf(float x) {
1229 $abstract long int LRINTF(float x);
1230
1231 $assume(LRINTF(x) < (x+1) && LRINTF(x) > (x-1));
1232 return LRINTF(x);
1233}
1234
1235long int lrintl(long double x) {
1236 $abstract long int LRINTL(long double x);
1237
1238 $assume(LRINTL(x) < (x+1) && LRINTL(x) > (x-1));
1239 return LRINTL(x);
1240}
1241
1242long long int llrint(double x) {
1243 $abstract long long int LLRINT(double x);
1244
1245 $assume(LLRINT(x) < (x+1) && LLRINT(x) > (x-1));
1246 return LLRINT(x);
1247}
1248
1249long long int llrintf(float x) {
1250 $abstract long long int LLRINTF(float x);
1251
1252 $assume(LLRINTF(x) < (x+1) && LLRINTF(x) > (x-1));
1253 return LLRINTF(x);
1254}
1255
1256long long int llrintl(long double x) {
1257 $abstract long long int LLRINTL(long double x);
1258
1259 $assume(LLRINTL(x) < (x+1) && LLRINTL(x) > (x-1));
1260 return LLRINTL(x);
1261}
1262
1263double round(double x) {
1264 $abstract double ROUND(double x);
1265
1266 $assume(ROUND(x) < (x+1) && ROUND(x) > (x-1));
1267 return ROUND(x);
1268}
1269
1270float roundf(float x) {
1271 $abstract float ROUNDF(float x);
1272
1273 $assume(ROUNDF(x) < (x+1) && ROUNDF(x) > (x-1));
1274 return ROUNDF(x);
1275}
1276
1277long double roundl(long double x) {
1278 $abstract long double ROUNDL(long double x);
1279
1280 $assume(ROUNDL(x) < (x+1) && ROUNDL(x) > (x-1));
1281 return ROUNDL(x);
1282}
1283
1284long int lround(double x) {
1285 $abstract long int LROUND(double x);
1286
1287 $assume(LROUND(x) < (x+1) && LROUND(x) > (x-1));
1288 return LROUND(x);
1289}
1290
1291long int lroundf(float x) {
1292 $abstract long int LROUNDF(float x);
1293
1294 $assume(LROUNDF(x) < (x+1) && LROUNDF(x) > (x-1));
1295 return LROUNDF(x);
1296}
1297
1298long int lroundl(long double x) {
1299 $abstract long int LROUNDL(long double x);
1300
1301 $assume(LROUNDL(x) < (x+1) && LROUNDL(x) > (x-1));
1302 return LROUNDL(x);
1303}
1304
1305long long int llround(double x) {
1306 $abstract long long int LLROUND(double x);
1307
1308 $assume(LLROUND(x) < (x+1) && LLROUND(x) > (x-1));
1309 return LLROUND(x);
1310}
1311
1312long long int llroundf(float x) {
1313 $abstract long long int LLROUNDF(float x);
1314
1315 $assume(LLROUNDF(x) < (x+1) && LLROUNDF(x) > (x-1));
1316 return LLROUNDF(x);
1317}
1318
1319long long int llroundl(long double x) {
1320 $abstract long long int LLROUNDL(long double x);
1321
1322 $assume(LLROUNDL(x) < (x+1) && LLROUNDL(x) > (x-1));
1323 return LLROUNDL(x);
1324}
1325
1326double trunc(double x) {
1327 $abstract double TRUNC(double x);
1328
1329 $assume(TRUNC(x) < (x) && TRUNC(x) > (x-1));
1330 return TRUNC(x);
1331}
1332
1333float truncf(float x) {
1334 $abstract float TRUNCF(float x);
1335
1336 $assume(TRUNCF(x) < (x) && TRUNCF(x) > (x-1));
1337 return TRUNCF(x);
1338}
1339
1340long double truncl(long double x) {
1341 $abstract long double TRUNCL(long double x);
1342
1343 $assume(TRUNCL(x) < (x) && TRUNCL(x) > (x-1));
1344 return TRUNCL(x);
1345}
1346
1347double fmod(double x, double y) {
1348 $abstract double FMOD(double x, double y);
1349
1350 $assert(y != 0, "Argument y should not be 0");
1351 return FMOD(x,y);
1352}
1353
1354float fmodf(float x, float y) {
1355 $abstract float FMODF(float x, float y);
1356
1357 $assert(y != 0, "Argument y should not be 0");
1358 return FMODF(x,y);
1359}
1360
1361long double fmodl(long double x, long double y) {
1362 $abstract long double FMODL(long double x, long double y);
1363
1364 $assert(y != 0, "Argument y should not be 0");
1365 return FMODL(x,y);
1366}
1367
1368double remainder(double x, double y) {
1369 $abstract double REMAINDER(double x, double y);
1370
1371 $assert(y != 0, "Argument y should not be 0");
1372 return REMAINDER(x,y);
1373}
1374
1375float remainderf(float x, float y) {
1376 $abstract float REMAINDERF(float x, float y);
1377
1378 $assert(y != 0, "Argument y should not be 0");
1379 return REMAINDERF(x,y);
1380}
1381
1382long double remainderl(long double x, long double y) {
1383 $abstract long double REMAINDERL(long double x, long double y);
1384
1385 $assert(y != 0, "Argument y should not be 0");
1386 return REMAINDERL(x,y);
1387}
1388
1389
1390double remquo(double x, double y, int *quo) {
1391 $abstract double REMQUO(double x, double y);
1392 $abstract int REMQUO_QUO(double x, double y);
1393
1394 $assert(y != 0, "Argument y should not be 0");
1395 (*quo) = REMQUO_QUO(x, y);
1396 return REMQUO(x,y);
1397}
1398
1399float remquof(float x, float y, int *quo) {
1400 $abstract float REMQUOF(float x, float y);
1401 $abstract int REMQUOF_QUO(float x, float y);
1402
1403 $assert(y != 0, "Argument y should not be 0");
1404 (*quo) = REMQUOF_QUO(x, y);
1405 return REMQUOF(x,y);
1406}
1407
1408long double remquol(long double x, long double y, int *quo) {
1409 $abstract long double REMQUOL(long double x, long double y);
1410 $abstract int REMQUOL_QUO(long double x, long double y);
1411
1412 $assert(y != 0, "Argument y should not be 0");
1413 (*quo) = REMQUOL_QUO(x, y);
1414 return REMQUOL(x,y);
1415}
1416
1417double copysign(double x, double y) {
1418 $abstract double COPYSIGN(double x, double y);
1419
1420 return COPYSIGN(x,y);
1421}
1422
1423float copysignf(float x, float y) {
1424 $abstract float COPYSIGNF(float x, float y);
1425
1426 return COPYSIGNF(x,y);
1427}
1428
1429long double copysignl(long double x, long double y) {
1430 $abstract long double COPYSIGNL(long double x, long double y);
1431
1432 return COPYSIGNL(x,y);
1433}
1434
1435double nan(const char *tagp) {
1436 // changed by sfsiegel from NAN to CNAN
1437 // since NAN is already used
1438 $abstract double CNAN(const char *tagp);
1439
1440 return CNAN(tagp);
1441}
1442
1443float nanf(const char *tagp) {
1444 $abstract float NANF(const char *tagp);
1445
1446 return NANF(tagp);
1447}
1448
1449long double nanl(const char *tagp) {
1450 $abstract long double NANL(const char *tagp);
1451
1452 return NANL(tagp);
1453}
1454
1455double nextafter(double x, double y) {
1456 $abstract double NEXTAFTER(double x, double y);
1457
1458 return NEXTAFTER(x,y);
1459}
1460
1461float nextafterf(float x, float y) {
1462 $abstract float NEXTAFTERF(float x, float y);
1463
1464 return NEXTAFTERF(x,y);
1465}
1466
1467long double nextafterl(long double x, long double y) {
1468 $abstract long double NEXTAFTERL(long double x, long double y);
1469
1470 return NEXTAFTERL(x,y);
1471}
1472
1473double nexttoward(double x, long double y) {
1474 $abstract double NEXTTOWARD(double x, long double y);
1475
1476 return NEXTTOWARD(x,y);
1477}
1478
1479float nexttowardf(float x, long double y) {
1480 $abstract float NEXTTOWARDF(float x, long double y);
1481
1482 return NEXTTOWARDF(x,y);
1483}
1484
1485long double nexttowardl(long double x, long double y) {
1486 $abstract long double NEXTTOWARDL(long double x, long double y);
1487
1488 return NEXTTOWARDL(x,y);
1489}
1490
1491double fdim(double x, double y) {
1492 return (x>y)?(x-y):0;
1493}
1494
1495float fdimf(float x, float y) {
1496 return (x>y)?(x-y):0;
1497}
1498
1499long double fdiml(long double x, long double y) {
1500 return (x>y)?(x-y):0;
1501}
1502
1503double fmax(double x, double y) {
1504 return (x>y)?(x):(y);
1505}
1506
1507float fmaxf(float x, float y) {
1508 return (x>y)?(x):(y);
1509}
1510
1511long double fmaxl(long double x, long double y) {
1512 return (x>y)?(x):(y);
1513}
1514
1515double fmin(double x, double y) {
1516 return (x<y)?(x):(y);
1517}
1518
1519float fminf(float x, float y) {
1520 return (x<y)?(x):(y);
1521}
1522
1523long double fminl(long double x, long double y) {
1524 return (x<y)?(x):(y);
1525}
1526
1527double fma(double x, double y, double z) {
1528 $abstract double FMA(double x, double y, double z);
1529
1530 return FMA(x,y,z);
1531}
1532
1533float fmaf(float x, float y, float z) {
1534 $abstract float FMAF(float x, float y, float z);
1535
1536 return FMAF(x,y,z);
1537}
1538
1539long double fmal(long double x, long double y, long double z) {
1540 $abstract long double FMAL(long double x,
1541 long double y, long double z);
1542
1543 return FMAL(x,y,z);
1544}
1545
1546#define isgreater(X,Y) ((X)>(Y))
1547#define isgreaterequal(X,Y) ((X)>=(Y))
1548#define isless(X,Y) ((X)<(Y))
1549#define islessequal(X,Y) ((X)<=(Y))
1550#define islessgreater(X,Y) ((X)<(Y))||((X)>(Y))
1551#define isunordered(X,Y) (X>Y)?1:0
1552
1553#endif
1554
1555
Note: See TracBrowser for help on using the repository browser.