13 #ifndef ad_dual_test_suite_hpp
14 #define ad_dual_test_suite_hpp
27 template<
typename data__>
124 TEST_ASSERT(d3.
exact(d2));
133 TEST_ASSERT(d1.
exact(d2));
139 TEST_ASSERT(d4.exact(d5));
145 TEST_ASSERT(d4.exact(d5));
150 eli::mutil::ad::dual<data__, false> d1(1,3), d2(1,2), d3(1,2), d4(-2,4), d5(2,4), d6(2,0), d7(1,-3), d8(3,-1);
176 TEST_ASSERT(d5==(d2+d3));
177 TEST_ASSERT(d5!=(d1+d3));
178 TEST_ASSERT(d4!=(d5+d6));
179 TEST_ASSERT(d5!=(d1+d4));
180 TEST_ASSERT((d2+d3)==d5);
181 TEST_ASSERT((d1+d3)!=d5);
182 TEST_ASSERT((d5+d6)!=d4);
183 TEST_ASSERT((d1+d4)!=d5);
186 TEST_ASSERT((d7+d1)==v1);
187 TEST_ASSERT((d1+d2)!=v1);
188 TEST_ASSERT((d1+d4)!=v1);
189 TEST_ASSERT(v1==(d7+d1));
190 TEST_ASSERT(v1!=(d1+d2));
191 TEST_ASSERT(v1!=(d1+d4));
194 TEST_ASSERT((d7+d1)==2);
195 TEST_ASSERT((d1+d2)!=2);
196 TEST_ASSERT((d1+d4)!=2);
197 TEST_ASSERT(2==(d7+d1));
198 TEST_ASSERT(2!=(d1+d2));
199 TEST_ASSERT(2!=(d1+d4));
202 TEST_ASSERT((d2+d3)==(d2+d3));
203 TEST_ASSERT((d2+d3)!=(d1+d3));
204 TEST_ASSERT((d4+d6)!=(d5+d6));
205 TEST_ASSERT((d1+d5)!=(d1+d4));
212 eli::mutil::ad::dual<data__, true> d1(1,3), d2(1,2), d3(1,2), d4(-2,4), d5(2,4), d6(2,0), d7(1,-3), d8(3,-1);
238 TEST_ASSERT(d5==(d2+d3));
239 TEST_ASSERT(d5==(d1+d3));
240 TEST_ASSERT(d4!=(d5+d6));
241 TEST_ASSERT(d5!=(d1+d4));
242 TEST_ASSERT((d2+d3)==d5);
243 TEST_ASSERT((d1+d3)==d5);
244 TEST_ASSERT((d5+d6)!=d4);
245 TEST_ASSERT((d1+d4)!=d5);
248 TEST_ASSERT((d7+d1)==v1);
249 TEST_ASSERT((d1+d2)==v1);
250 TEST_ASSERT((d1+d4)!=v1);
251 TEST_ASSERT(v1==(d7+d1));
252 TEST_ASSERT(v1==(d1+d2));
253 TEST_ASSERT(v1!=(d1+d4));
256 TEST_ASSERT((d7+d1)==2);
257 TEST_ASSERT((d1+d2)==2);
258 TEST_ASSERT((d1+d4)!=2);
259 TEST_ASSERT(2==(d7+d1));
260 TEST_ASSERT(2==(d1+d2));
261 TEST_ASSERT(2!=(d1+d4));
264 TEST_ASSERT((d2+d3)==(d2+d3));
265 TEST_ASSERT((d2+d3)==(d1+d3));
266 TEST_ASSERT((d4+d6)!=(d5+d6));
267 TEST_ASSERT((d1+d5)!=(d1+d4));
292 TEST_ASSERT(d5<=(d2+d3));
293 TEST_ASSERT(d5<=(d1+d3));
294 TEST_ASSERT(d4<=(d5+d6));
295 TEST_ASSERT(d4<=(d1+d2));
296 TEST_ASSERT((d2+d3)<=d5);
297 TEST_ASSERT((d1+d3)<=d5);
298 TEST_ASSERT((d2-d3)<=d6);
299 TEST_ASSERT((d3+d4)<=d5);
302 TEST_ASSERT((d7+d1)<=v1);
303 TEST_ASSERT((d1+d2)<=v1);
304 TEST_ASSERT((d1+d4)<=v1);
305 TEST_ASSERT(v1<=(d7+d1));
306 TEST_ASSERT(v1<=(d1+d2));
307 TEST_ASSERT(v1<=(d5+d6));
310 TEST_ASSERT((d7+d1)<=2);
311 TEST_ASSERT((d1+d2)<=2);
312 TEST_ASSERT((d1+d4)<=2);
313 TEST_ASSERT(2<=(d7+d1));
314 TEST_ASSERT(2<=(d1+d2));
315 TEST_ASSERT(2<=(d5+d6));
318 TEST_ASSERT((d2+d3)<=(d2+d3));
319 TEST_ASSERT((d2+d3)<=(d1+d3));
320 TEST_ASSERT((d4+d6)<=(d5+d6));
321 TEST_ASSERT((d1+d4)<=(d1+d5));
346 TEST_ASSERT(d5>=(d2+d3));
347 TEST_ASSERT(d5>=(d1+d3));
348 TEST_ASSERT(d6>=(d2-d3));
349 TEST_ASSERT(d5>=(d3+d4));
350 TEST_ASSERT((d2+d3)>=d5);
351 TEST_ASSERT((d1+d3)>=d5);
352 TEST_ASSERT((d5+d6)>=d4);
353 TEST_ASSERT((d1+d2)>=d4);
356 TEST_ASSERT((d7+d1)>=v1);
357 TEST_ASSERT((d1+d2)>=v1);
358 TEST_ASSERT((d5+d6)>=v1);
359 TEST_ASSERT(v1>=(d7+d1));
360 TEST_ASSERT(v1>=(d1+d2));
361 TEST_ASSERT(v1>=(d1+d4));
364 TEST_ASSERT((d7+d1)>=2);
365 TEST_ASSERT((d1+d2)>=2);
366 TEST_ASSERT((d5+d6)>=2);
367 TEST_ASSERT(2>=(d7+d1));
368 TEST_ASSERT(2>=(d1+d2));
369 TEST_ASSERT(2>=(d1+d4));
372 TEST_ASSERT((d2+d3)>=(d2+d3));
373 TEST_ASSERT((d2+d3)>=(d1+d3));
374 TEST_ASSERT((d5+d6)>=(d4+d6));
375 TEST_ASSERT((d1+d5)>=(d1+d4));
390 TEST_ASSERT(d4<(d5+d6));
391 TEST_ASSERT(d4<(d1+d2));
392 TEST_ASSERT((d2-d3)<d6);
393 TEST_ASSERT((d3+d4)<d5);
396 TEST_ASSERT((d1+d4)<v1);
397 TEST_ASSERT(v1<(d5+d6));
400 TEST_ASSERT((d1+d4)<2);
401 TEST_ASSERT(2<(d5+d6));
404 TEST_ASSERT((d4+d6)<(d5+d6));
405 TEST_ASSERT((d1+d4)<(d1+d5));
420 TEST_ASSERT(d6>(d2-d3));
421 TEST_ASSERT(d5>(d3+d4));
422 TEST_ASSERT((d5+d6)>d4);
423 TEST_ASSERT((d1+d2)>d4);
426 TEST_ASSERT((d5+d6)>v1);
427 TEST_ASSERT(v1>(d1+d4));
430 TEST_ASSERT((d5+d6)>2);
431 TEST_ASSERT(2>(d1+d4));
434 TEST_ASSERT((d5+d6)>(d4+d6));
435 TEST_ASSERT((d1+d5)>(d1+d4));
447 TEST_ASSERT(d4.
exact(d5));
454 TEST_ASSERT(d4.exact(d5));
461 TEST_ASSERT(d4.exact(d5));
468 TEST_ASSERT(d4.exact(d5));
475 TEST_ASSERT(d4.exact(d5));
479 d5.
set_real(d4.real()+(d1.real()+d2.real()));
480 d5.
set_nonreal(d4.nonreal()+(d1.nonreal()+d2.nonreal()));
482 TEST_ASSERT(d4.exact(d5));
485 d5.
set_real((d1.real()+d2.real())+d3.real());
486 d5.
set_nonreal((d1.nonreal()+d2.nonreal())+d3.nonreal());
488 TEST_ASSERT(d4.exact(d5));
491 d5.
set_real(d1.real()+(d2.real()+d3.real()));
492 d5.
set_nonreal(d1.nonreal()+(d2.nonreal()+d3.nonreal()));
494 TEST_ASSERT(d4.exact(d5));
497 d5.
set_real(d1.real()+d2.real()+d3.real());
498 d5.
set_nonreal(d1.nonreal()+d2.nonreal()+d3.nonreal());
500 TEST_ASSERT(d4.exact(d5));
503 d5.
set_real((d1.real()+d2.real())+(d3.real()+d3.real()));
504 d5.
set_nonreal((d1.nonreal()+d2.nonreal())+(d3.nonreal()+d3.nonreal()));
506 TEST_ASSERT(d4.exact(d5));
512 TEST_ASSERT(d4.exact(d5));
518 TEST_ASSERT(d4.exact(d5));
521 d5.
set_real(d2.real()+d3.real()+v1);
524 TEST_ASSERT(d4.exact(d5));
527 d5.
set_real(v1+d2.real()+d3.real());
530 TEST_ASSERT(d4.exact(d5));
536 TEST_ASSERT(d4.exact(d5));
542 TEST_ASSERT(d4.exact(d5));
554 TEST_ASSERT(d4.
exact(d5));
561 TEST_ASSERT(d4.exact(d5));
568 TEST_ASSERT(d4.exact(d5));
575 TEST_ASSERT(d4.exact(d5));
582 TEST_ASSERT(d4.exact(d5));
586 d5.
set_real(d4.real()-(d1.real()-d2.real()));
587 d5.
set_nonreal(d4.nonreal()-(d1.nonreal()-d2.nonreal()));
589 TEST_ASSERT(d4.exact(d5));
592 d5.
set_real((d1.real()-d2.real())-d3.real());
593 d5.
set_nonreal((d1.nonreal()-d2.nonreal())-d3.nonreal());
595 TEST_ASSERT(d4.exact(d5));
598 d5.
set_real(d1.real()-(d2.real()-d3.real()));
599 d5.
set_nonreal(d1.nonreal()-(d2.nonreal()-d3.nonreal()));
601 TEST_ASSERT(d4.exact(d5));
604 d5.
set_real(d1.real()-d2.real()-d3.real());
605 d5.
set_nonreal(d1.nonreal()-d2.nonreal()-d3.nonreal());
607 TEST_ASSERT(d4.exact(d5));
610 d5.
set_real((d1.real()-d2.real())-(d3.real()+d3.real()));
611 d5.
set_nonreal((d1.nonreal()-d2.nonreal())-(d3.nonreal()+d3.nonreal()));
613 TEST_ASSERT(d4.exact(d5));
619 TEST_ASSERT(d4.exact(d5));
625 TEST_ASSERT(d4.exact(d5));
628 d5.
set_real(d2.real()-d3.real()-v1);
631 TEST_ASSERT(d4.exact(d5));
634 d5.
set_real(v1-d2.real()-d3.real());
637 TEST_ASSERT(d4.exact(d5));
643 TEST_ASSERT(d4.exact(d5));
649 TEST_ASSERT(d4.exact(d5));
659 d5.
set_nonreal(d2.real()*d3.nonreal()+d2.nonreal()*d3.real());
661 TEST_ASSERT(d4.
exact(d5));
666 d5.
set_nonreal(d2.real()*d4.nonreal()+d2.nonreal()*d4.real());
668 TEST_ASSERT(d4.exact(d5));
673 d5.
set_nonreal(d2.real()*d4.nonreal()+d2.nonreal()*d4.real());
675 TEST_ASSERT(d4.exact(d5));
682 TEST_ASSERT(d4.exact(d5));
689 TEST_ASSERT(d4.exact(d5));
697 TEST_ASSERT(d4.exact(d5));
702 d5.
set_nonreal(d6.real()*d3.nonreal()+d6.nonreal()*d3.real());
704 TEST_ASSERT(d4.exact(d5));
709 d5.
set_nonreal(d1.real()*d6.nonreal()+d1.nonreal()*d6.real());
711 TEST_ASSERT(d4.exact(d5));
714 d6.set_real(d1.real()*d2.real());
715 d6.set_nonreal(d1.real()*d2.nonreal()+d1.nonreal()*d2.real());
717 d5.
set_nonreal(d6.real()*d3.nonreal()+d6.nonreal()*d3.real());
719 TEST_ASSERT(d4.exact(d5));
723 d5.
set_nonreal(d1.real()*d2.nonreal()+d1.nonreal()*d2.real());
724 d6.set_real(d3.real()*d3.real());
725 d6.set_nonreal(d3.real()*d3.nonreal()+d3.nonreal()*d3.real());
728 TEST_ASSERT(d4.exact(d5));
734 TEST_ASSERT(d4.exact(d5));
740 TEST_ASSERT(d4.exact(d5));
743 d5.
set_real(d2.real()*d3.real()*v1);
744 d5.
set_nonreal((d2.real()*d3.nonreal()+d2.nonreal()*d3.real())*v1);
746 TEST_ASSERT(d4.exact(d5));
749 d5.
set_real(v1*d2.real()*d3.real());
750 d5.
set_nonreal(v1*(d2.real()*d3.nonreal()+d2.nonreal()*d3.real()));
752 TEST_ASSERT(d4.exact(d5));
758 TEST_ASSERT(d4.exact(d5));
764 TEST_ASSERT(d4.exact(d5));
774 d5.
set_nonreal((d2.nonreal()*d3.real()-d2.real()*d3.nonreal())/d3.real()/d3.real());
776 TEST_ASSERT(d4.
exact(d5));
781 d5.
set_nonreal((d2.nonreal()*d4.real()-d2.real()*d4.nonreal())/d4.real()/d4.real());
783 TEST_ASSERT(d4.exact(d5));
788 d5.
set_nonreal((d2.nonreal()/d4.real()-d2.real()*d4.nonreal())/d4.real()/d4.real());
790 TEST_ASSERT(d4.exact(d5));
797 TEST_ASSERT(d4.exact(d5));
804 TEST_ASSERT(d4.exact(d5));
812 TEST_ASSERT(d4.exact(d5));
817 d5.
set_nonreal((d6.nonreal()*d3.real()-d6.real()*d3.nonreal())/d3.real()/d3.real());
819 TEST_ASSERT(d4.exact(d5));
824 d5.
set_nonreal((d1.nonreal()*d6.real()-d1.real()*d6.nonreal())/d6.real()/d6.real());
826 TEST_ASSERT(d4.exact(d5));
829 d6.set_real(d1.real()/d2.real());
830 d6.set_nonreal((d1.nonreal()*d2.real()-d1.real()*d2.nonreal())/d2.real()/d2.real());
832 d5.
set_nonreal((d6.nonreal()*d3.real()-d6.real()*d3.nonreal())/d3.real()/d3.real());
834 TEST_ASSERT(d4.exact(d5));
838 d5.
set_nonreal((d1.nonreal()*d2.real()-d1.real()*d2.nonreal())/d2.real()/d2.real());
839 TEST_ASSERT(d5.
exact(d1/d2));
840 d6.set_real(d3.real()/d4.real());
841 d6.set_nonreal((d3.nonreal()*d4.real()-d3.real()*d4.nonreal())/d4.real()/d4.real());
842 TEST_ASSERT(d6.exact(d3/d4));
845 TEST_ASSERT(d7.
exact(d5));
849 d5.set_nonreal(d2.nonreal()/v1);
851 TEST_ASSERT(d4.exact(d5));
854 d5.set_real(v1/d2.real());
855 d5.set_nonreal(-v1*d2.nonreal()/d2.real()/d2.real());
857 TEST_ASSERT(d4.exact(d5));
860 d5.set_real(d2.real()/d3.real()/v1);
861 d5.set_nonreal((d2.nonreal()*d3.real()-d2.real()*d3.nonreal())/d3.real()/d3.real()/v1);
863 TEST_ASSERT(d4.exact(d5));
866 d6.set_real(v1/d2.real());
867 d6.set_nonreal(-v1*d2.nonreal()/d2.real()/d2.real());
868 d5.set_real(d6.real()/d3.real());
869 d5.set_nonreal((d6.nonreal()*d3.real()-d6.real()*d3.nonreal())/d3.real()/d3.real());
871 TEST_ASSERT(d4.exact(d5));
874 d5.set_real(d2.real()/2);
875 d5.set_nonreal(d2.nonreal()/2);
877 TEST_ASSERT(d4.exact(d5));
880 d5.set_real(2/d2.real());
881 d5.set_nonreal(-2*d2.nonreal()/d2.real()/d2.real());
883 TEST_ASSERT(d4.exact(d5));
890 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
897 TEST_ASSERT(d0.
nearly(dref, tol));
902 dref.
set_nonreal(d3.nonreal()*std::cos(d3.real()));
904 TEST_ASSERT(d0.
nearly(dref, tol));
912 d0=std::sin(std::sin(d1+d2));
913 TEST_ASSERT(d0.
nearly(dref, tol));
918 dref.
set_nonreal(-d3.nonreal()*std::sin(d3.real()));
920 TEST_ASSERT(d0.
nearly(dref, tol));
925 dref.
set_nonreal(-d3.nonreal()*std::sin(d3.real()));
927 TEST_ASSERT(d0.
nearly(dref, tol));
935 d0=std::cos(std::cos(d1+d2));
936 TEST_ASSERT(d0.
nearly(dref, tol));
941 dref.
set_nonreal(d3.nonreal()/std::cos(d3.real())/std::cos(d3.real()));
943 TEST_ASSERT(d0.
nearly(dref, tol));
948 dref.
set_nonreal(d3.nonreal()/std::cos(d3.real())/std::cos(d3.real()));
950 TEST_ASSERT(d0.
nearly(dref, tol));
955 d4.
set_nonreal(d3.nonreal()/std::cos(d3.real())/std::cos(d3.real()));
958 d0=std::tan(std::tan(d1+d2));
959 TEST_ASSERT(d0.
nearly(dref, tol));
963 dref.
set_real(std::asin(d3.real()));
964 dref.
set_nonreal(d3.nonreal()/std::sqrt(1-d3.real()*d3.real()));
966 TEST_ASSERT(d0.
nearly(dref, tol));
970 dref.
set_real(std::asin(d3.real()));
971 dref.
set_nonreal(d3.nonreal()/std::sqrt(1-d3.real()*d3.real()));
972 d0=std::asin((d1+d2)/v1);
973 TEST_ASSERT(d0.
nearly(dref, tol));
978 d0=std::asin(std::sin((d1+d2)/v1));
979 TEST_ASSERT(d0.
nearly(dref, tol));
983 dref.
set_real(std::acos(d3.real()));
984 dref.
set_nonreal(-d3.nonreal()/std::sqrt(1-d3.real()*d3.real()));
986 TEST_ASSERT(d0.
nearly(dref, tol));
990 dref.
set_real(std::acos(d3.real()));
991 dref.
set_nonreal(-d3.nonreal()/std::sqrt(1-d3.real()*d3.real()));
992 d0=std::acos((d1+d2)/v1);
993 TEST_ASSERT(d0.
nearly(dref, tol));
998 d0=std::acos(std::cos((d1+d2)/v1));
999 TEST_ASSERT(d0.
nearly(dref, tol));
1003 dref.
set_real(std::atan(d3.real()));
1004 dref.
set_nonreal(d3.nonreal()/(1+d3.real()*d3.real()));
1006 TEST_ASSERT(d0.
nearly(dref, tol));
1010 dref.
set_real(std::atan(d3.real()));
1011 dref.
set_nonreal(d3.nonreal()/(1+d3.real()*d3.real()));
1012 d0=std::atan((d1+d2)/v1);
1013 TEST_ASSERT(d0.
nearly(dref, tol));
1018 d0=std::atan(std::tan((d1+d2)/v1));
1019 TEST_ASSERT(d0.
nearly(dref, tol));
1027 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
1034 TEST_ASSERT(d0.
nearly(dref, tol));
1041 TEST_ASSERT(d0.
nearly(dref, tol));
1050 TEST_ASSERT(d0.
nearly(dref, tol));
1057 TEST_ASSERT(d0.
nearly(dref, tol));
1064 TEST_ASSERT(d0.
nearly(dref, tol));
1073 TEST_ASSERT(d0.
nearly(dref, tol));
1078 dref.
set_nonreal(d3.nonreal()/cos(d3.real())/cos(d3.real()));
1080 TEST_ASSERT(d0.
nearly(dref, tol));
1085 dref.
set_nonreal(d3.nonreal()/cos(d3.real())/cos(d3.real()));
1087 TEST_ASSERT(d0.
nearly(dref, tol));
1092 d4.
set_nonreal(d3.nonreal()/cos(d3.real())/cos(d3.real()));
1096 TEST_ASSERT(d0.
nearly(dref, tol));
1101 dref.
set_nonreal(d3.nonreal()/sqrt(1-d3.real()*d3.real()));
1103 TEST_ASSERT(d0.
nearly(dref, tol));
1108 dref.
set_nonreal(d3.nonreal()/sqrt(1-d3.real()*d3.real()));
1109 d0=asin((d1+d2)/v1);
1110 TEST_ASSERT(d0.
nearly(dref, tol));
1115 d0=asin(sin((d1+d2)/v1));
1116 TEST_ASSERT(d0.
nearly(dref, tol));
1121 dref.
set_nonreal(-d3.nonreal()/sqrt(1-d3.real()*d3.real()));
1123 TEST_ASSERT(d0.
nearly(dref, tol));
1128 dref.
set_nonreal(-d3.nonreal()/sqrt(1-d3.real()*d3.real()));
1129 d0=acos((d1+d2)/v1);
1130 TEST_ASSERT(d0.
nearly(dref, tol));
1135 d0=acos(cos((d1+d2)/v1));
1136 TEST_ASSERT(d0.
nearly(dref, tol));
1141 dref.
set_nonreal(d3.nonreal()/(1+d3.real()*d3.real()));
1143 TEST_ASSERT(d0.
nearly(dref, tol));
1148 dref.
set_nonreal(d3.nonreal()/(1+d3.real()*d3.real()));
1149 d0=atan((d1+d2)/v1);
1150 TEST_ASSERT(d0.
nearly(dref, tol));
1155 d0=atan(std::tan((d1+d2)/v1));
1156 TEST_ASSERT(d0.
nearly(dref, tol));
1164 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
1171 TEST_ASSERT(d0.
nearly(dref, tol));
1175 dref.
set_real(std::sinh(d3.real()));
1176 dref.
set_nonreal(d3.nonreal()*std::cosh(d3.real()));
1177 d0=std::sinh(d1+d2);
1178 TEST_ASSERT(d0.
nearly(dref, tol));
1183 d4.
set_nonreal(d3.nonreal()*std::cosh(d3.real()));
1186 d0=std::sinh(std::sinh(d1+d2));
1187 #if defined(_MSC_VER) && defined(NDEBUG) && !defined(_WIN64)
1188 TEST_ASSERT(d0.
nearly(dref, static_cast<data__>(1e-2)));
1190 TEST_ASSERT(d0.
nearly(dref, tol));
1195 dref.
set_real(std::cosh(d3.real()));
1196 dref.
set_nonreal(d3.nonreal()*std::sinh(d3.real()));
1198 TEST_ASSERT(d0.
nearly(dref, tol));
1202 dref.
set_real(std::cosh(d3.real()));
1203 dref.
set_nonreal(d3.nonreal()*std::sinh(d3.real()));
1204 d0=std::cosh(d1+d2);
1205 TEST_ASSERT(d0.
nearly(dref, tol));
1210 d4.
set_nonreal(d3.nonreal()*std::sinh(d3.real()));
1213 d0=std::cosh(std::cosh(d1+d2));
1214 #if defined(_MSC_VER) && defined(NDEBUG) && !defined(_WIN64)
1215 TEST_ASSERT(d0.
nearly(dref, static_cast<data__>(2e-3)));
1217 TEST_ASSERT(d0.
nearly(dref, tol));
1222 dref.
set_real(std::tanh(d3.real()));
1223 dref.
set_nonreal(d3.nonreal()/std::cosh(d3.real())/std::cosh(d3.real()));
1225 TEST_ASSERT(d0.
nearly(dref, tol));
1229 dref.
set_real(std::tanh(d3.real()));
1230 dref.
set_nonreal(d3.nonreal()/std::cosh(d3.real())/std::cosh(d3.real()));
1231 d0=std::tanh(d1+d2);
1232 TEST_ASSERT(d0.
nearly(dref, tol));
1237 d4.
set_nonreal(d3.nonreal()/std::cosh(d3.real())/std::cosh(d3.real()));
1240 d0=std::tanh(std::tanh(d1+d2));
1241 TEST_ASSERT(d0.
nearly(dref, tol));
1245 dref.
set_real(std::asinh(d3.real()));
1246 dref.
set_nonreal(d3.nonreal()/std::sqrt(1+d3.real()*d3.real()));
1248 TEST_ASSERT(d0.
nearly(dref, tol));
1252 dref.
set_real(std::asinh(d3.real()));
1253 dref.
set_nonreal(d3.nonreal()/std::sqrt(1+d3.real()*d3.real()));
1254 d0=std::asinh((d1+d2));
1255 TEST_ASSERT(d0.
nearly(dref, tol));
1260 d0=std::asinh(std::sinh(d1+d2));
1261 TEST_ASSERT(d0.
nearly(dref, tol));
1265 dref.
set_real(std::acosh(d3.real()));
1266 dref.
set_nonreal(d3.nonreal()/std::sqrt(d3.real()*d3.real()-1));
1268 TEST_ASSERT(d0.
nearly(dref, tol));
1272 dref.
set_real(std::acosh(d3.real()));
1273 dref.
set_nonreal(d3.nonreal()/std::sqrt(d3.real()*d3.real()-1));
1274 d0=std::acosh(d1+d2);
1275 TEST_ASSERT(d0.
nearly(dref, tol));
1280 d0=std::acosh(std::cosh(d1+d2));
1281 TEST_ASSERT(d0.
nearly(dref, tol));
1285 dref.
set_real(std::atanh(d3.real()));
1286 dref.
set_nonreal(d3.nonreal()/(1-d3.real()*d3.real()));
1288 TEST_ASSERT(d0.
nearly(dref, tol));
1292 dref.
set_real(std::atanh(d3.real()));
1293 dref.
set_nonreal(d3.nonreal()/(1-d3.real()*d3.real()));
1294 d0=std::atanh((d1+d2)/8);
1295 TEST_ASSERT(d0.
nearly(dref, tol));
1300 d0=std::atanh(std::tanh((d1+d2)/4));
1301 TEST_ASSERT(d0.
nearly(dref, tol));
1307 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
1314 TEST_ASSERT(d0.
nearly(dref, tol));
1321 TEST_ASSERT(d0.
nearly(dref, tol));
1329 d0=sinh(sinh(d1+d2));
1330 #if defined(_MSC_VER) && defined(NDEBUG) && !defined(_WIN64)
1331 TEST_ASSERT(d0.
nearly(dref, static_cast<data__>(1e-2)));
1333 TEST_ASSERT(d0.
nearly(dref, tol));
1341 TEST_ASSERT(d0.
nearly(dref, tol));
1348 TEST_ASSERT(d0.
nearly(dref, tol));
1356 d0=cosh(cosh(d1+d2));
1357 #if defined(_MSC_VER) && defined(NDEBUG) && !defined(_WIN64)
1358 TEST_ASSERT(d0.
nearly(dref, static_cast<data__>(2e-3)));
1360 TEST_ASSERT(d0.
nearly(dref, tol));
1366 dref.
set_nonreal(d3.nonreal()/cosh(d3.real())/cosh(d3.real()));
1368 TEST_ASSERT(d0.
nearly(dref, tol));
1373 dref.
set_nonreal(d3.nonreal()/cosh(d3.real())/cosh(d3.real()));
1375 TEST_ASSERT(d0.
nearly(dref, tol));
1380 d4.
set_nonreal(d3.nonreal()/cosh(d3.real())/cosh(d3.real()));
1383 d0=tanh(tanh(d1+d2));
1384 TEST_ASSERT(d0.
nearly(dref, tol));
1389 dref.
set_nonreal(d3.nonreal()/sqrt(1+d3.real()*d3.real()));
1391 TEST_ASSERT(d0.
nearly(dref, tol));
1396 dref.
set_nonreal(d3.nonreal()/sqrt(1+d3.real()*d3.real()));
1398 TEST_ASSERT(d0.
nearly(dref, tol));
1403 d0=asinh(sinh(d1+d2));
1404 TEST_ASSERT(d0.
nearly(dref, tol));
1409 dref.
set_nonreal(d3.nonreal()/sqrt(d3.real()*d3.real()-1));
1411 TEST_ASSERT(d0.
nearly(dref, tol));
1416 dref.
set_nonreal(d3.nonreal()/sqrt(d3.real()*d3.real()-1));
1418 TEST_ASSERT(d0.
nearly(dref, tol));
1423 d0=acosh(cosh(d1+d2));
1424 TEST_ASSERT(d0.
nearly(dref, tol));
1429 dref.
set_nonreal(d3.nonreal()/(1-d3.real()*d3.real()));
1431 TEST_ASSERT(d0.
nearly(dref, tol));
1436 dref.
set_nonreal(d3.nonreal()/(1-d3.real()*d3.real()));
1437 d0=atanh((d1+d2)/8);
1438 TEST_ASSERT(d0.
nearly(dref, tol));
1443 d0=atanh(tanh((d1+d2)/4));
1444 TEST_ASSERT(d0.
nearly(dref, tol));
1450 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon())), two(2), ten(10);
1457 TEST_ASSERT(d0.
nearly(dref, tol));
1461 dref.
set_real(std::exp(d3.real()));
1462 dref.
set_nonreal(d3.nonreal()*std::exp(d3.real()));
1464 TEST_ASSERT(d0.
nearly(dref, tol));
1472 d0=std::exp(std::exp(d1+d2));
1473 TEST_ASSERT(d0.
nearly(dref, tol));
1477 dref.
set_real(std::expm1(d3.real()));
1478 dref.
set_nonreal(d3.nonreal()*std::exp(d3.real()));
1480 TEST_ASSERT(d0.
nearly(dref, tol));
1484 dref.
set_real(std::expm1(d3.real()));
1485 dref.
set_nonreal(d3.nonreal()*std::exp(d3.real()));
1486 d0=std::expm1(d1+d2);
1487 TEST_ASSERT(d0.
nearly(dref, tol));
1491 d4.
set_real(std::expm1(d3.real()));
1495 d0=std::expm1(std::expm1(d1+d2));
1496 TEST_ASSERT(d0.
nearly(dref, tol));
1500 dref.
set_real(std::exp2(d3.real()));
1501 dref.
set_nonreal(d3.nonreal()*std::log(two)*std::exp2(d3.real()));
1503 TEST_ASSERT(d0.
nearly(dref, tol));
1507 dref.
set_real(std::exp2(d3.real()));
1508 dref.
set_nonreal(d3.nonreal()*std::log(two)*std::exp2(d3.real()));
1509 d0=std::exp2(d1+d2);
1510 TEST_ASSERT(d0.
nearly(dref, tol));
1515 d4.
set_nonreal(d3.nonreal()*std::log(two)*std::exp2(d3.real()));
1518 d0=std::exp2(std::exp2(d1+d2));
1519 TEST_ASSERT(d0.
nearly(dref, tol));
1523 dref.
set_real(std::log(d3.real()));
1526 TEST_ASSERT(d0.
nearly(dref, tol));
1530 dref.
set_real(std::log(d3.real()));
1533 TEST_ASSERT(d0.
nearly(dref, tol));
1541 d0=std::log(std::log(d1+d2));
1542 TEST_ASSERT(d0.
nearly(dref, tol));
1546 dref.
set_real(std::log10(d3.real()));
1547 dref.
set_nonreal(d3.nonreal()/d3.real()/std::log(ten));
1549 TEST_ASSERT(d0.
nearly(dref, tol));
1553 dref.
set_real(std::log10(d3.real()));
1554 dref.
set_nonreal(d3.nonreal()/d3.real()/std::log(ten));
1555 d0=std::log10(d1+d2);
1556 TEST_ASSERT(d0.
nearly(dref, tol));
1560 d4.
set_real(std::log10(d3.real()));
1561 d4.
set_nonreal(d3.nonreal()/d3.real()/std::log(ten));
1564 d0=std::log10(std::log10(d1+d2));
1565 TEST_ASSERT(d0.
nearly(dref, tol));
1569 dref.
set_real(std::log2(d3.real()));
1570 dref.
set_nonreal(d3.nonreal()/d3.real()/std::log(two));
1572 TEST_ASSERT(d0.
nearly(dref, tol));
1576 dref.
set_real(std::log2(d3.real()));
1577 dref.
set_nonreal(d3.nonreal()/d3.real()/std::log(two));
1578 d0=std::log2(d1+d2);
1579 TEST_ASSERT(d0.
nearly(dref, tol));
1584 d4.
set_nonreal(d3.nonreal()/d3.real()/std::log(two));
1587 d0=std::log2(std::log2(d1+d2));
1588 TEST_ASSERT(d0.
nearly(dref, tol));
1592 dref.
set_real(std::log1p(d3.real()));
1595 TEST_ASSERT(d0.
nearly(dref, tol));
1599 dref.
set_real(std::log1p(d3.real()));
1601 d0=std::log1p(d1+d2);
1602 TEST_ASSERT(d0.
nearly(dref, tol));
1606 d4.
set_real(std::log1p(d3.real()));
1610 d0=std::log1p(std::log1p(d1+d2));
1611 TEST_ASSERT(d0.
nearly(dref, tol));
1617 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon())), two(2), ten(10);
1624 TEST_ASSERT(d0.
nearly(dref, tol));
1631 TEST_ASSERT(d0.
nearly(dref, tol));
1640 TEST_ASSERT(d0.
nearly(dref, tol));
1647 TEST_ASSERT(d0.
nearly(dref, tol));
1654 TEST_ASSERT(d0.
nearly(dref, tol));
1662 d0=expm1(expm1(d1+d2));
1663 TEST_ASSERT(d0.
nearly(dref, tol));
1668 dref.
set_nonreal(d3.nonreal()*log(two)*exp2(d3.real()));
1670 TEST_ASSERT(d0.
nearly(dref, tol));
1675 dref.
set_nonreal(d3.nonreal()*log(two)*exp2(d3.real()));
1677 TEST_ASSERT(d0.
nearly(dref, tol));
1682 d4.
set_nonreal(d3.nonreal()*log(two)*exp2(d3.real()));
1685 d0=exp2(exp2(d1+d2));
1686 TEST_ASSERT(d0.
nearly(dref, tol));
1693 TEST_ASSERT(d0.
nearly(dref, tol));
1700 TEST_ASSERT(d0.
nearly(dref, tol));
1709 TEST_ASSERT(d0.
nearly(dref, tol));
1714 dref.
set_nonreal(d3.nonreal()/d3.real()/log(ten));
1716 TEST_ASSERT(d0.
nearly(dref, tol));
1721 dref.
set_nonreal(d3.nonreal()/d3.real()/log(ten));
1723 TEST_ASSERT(d0.
nearly(dref, tol));
1731 d0=log10(log10(d1+d2));
1732 TEST_ASSERT(d0.
nearly(dref, tol));
1737 dref.
set_nonreal(d3.nonreal()/d3.real()/log(two));
1739 TEST_ASSERT(d0.
nearly(dref, tol));
1744 dref.
set_nonreal(d3.nonreal()/d3.real()/log(two));
1746 TEST_ASSERT(d0.
nearly(dref, tol));
1754 d0=log2(log2(d1+d2));
1755 TEST_ASSERT(d0.
nearly(dref, tol));
1762 TEST_ASSERT(d0.
nearly(dref, tol));
1769 TEST_ASSERT(d0.
nearly(dref, tol));
1777 d0=log1p(log1p(d1+d2));
1778 TEST_ASSERT(d0.
nearly(dref, tol));
1784 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
1791 TEST_ASSERT(d0.
nearly(dref, tol));
1795 dref.
set_real(std::sqrt(d3.real()));
1796 dref.
set_nonreal(d3.nonreal()/std::sqrt(d3.real())/2);
1797 d0=std::sqrt(d1+d2);
1798 TEST_ASSERT(d0.
nearly(dref, tol));
1803 d4.
set_nonreal(d3.nonreal()/std::sqrt(d3.real())/2);
1806 d0=std::sqrt(std::sqrt(d1+d2));
1807 TEST_ASSERT(d0.
nearly(dref, tol));
1811 dref.
set_real(std::cbrt(d3.real()));
1812 dref.
set_nonreal(d3.nonreal()/std::cbrt(d3.real()*d3.real())/3);
1814 TEST_ASSERT(d0.
nearly(dref, tol));
1818 dref.
set_real(std::cbrt(d3.real()));
1819 dref.
set_nonreal(d3.nonreal()/std::cbrt(d3.real()*d3.real())/3);
1820 d0=std::cbrt(d1+d2);
1821 TEST_ASSERT(d0.
nearly(dref, tol));
1826 d4.
set_nonreal(d3.nonreal()/std::cbrt(d3.real()*d3.real())/3);
1829 d0=std::cbrt(std::cbrt(d1+d2));
1830 TEST_ASSERT(d0.
nearly(dref, tol));
1840 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
1847 TEST_ASSERT(d0.
nearly(dref, tol));
1854 TEST_ASSERT(d0.
nearly(dref, tol));
1862 d0=sqrt(sqrt(d1+d2));
1863 TEST_ASSERT(d0.
nearly(dref, tol));
1868 dref.
set_nonreal(d3.nonreal()/cbrt(d3.real()*d3.real())/3);
1870 TEST_ASSERT(d0.
nearly(dref, tol));
1875 dref.
set_nonreal(d3.nonreal()/cbrt(d3.real()*d3.real())/3);
1877 TEST_ASSERT(d0.
nearly(dref, tol));
1882 d4.
set_nonreal(d3.nonreal()/cbrt(d3.real()*d3.real())/3);
1885 d0=cbrt(cbrt(d1+d2));
1886 TEST_ASSERT(d0.
nearly(dref, tol));
1896 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
1903 TEST_ASSERT(d0.
nearly(dref, tol));
1907 dref.
set_real(std::abs(d3.real()));
1908 dref.
set_nonreal(d3.nonreal()*((d3.real()<0)?(-1):(1)));
1910 TEST_ASSERT(d0.
nearly(dref, tol));
1915 d4.
set_nonreal(d3.nonreal()*((d3.real()<0)?(-1):(1)));
1918 d0=std::abs(std::abs(d1+d2));
1919 TEST_ASSERT(d0.
nearly(dref, tol));
1923 dref.
set_real(std::ceil(d3.real()));
1926 TEST_ASSERT(d0.
nearly(dref, tol));
1930 dref.
set_real(std::ceil(d3.real()));
1932 d0=std::ceil(d1+d2);
1933 TEST_ASSERT(d0.
nearly(dref, tol));
1941 d0=std::ceil(std::ceil(d1+d2));
1942 TEST_ASSERT(d0.
nearly(dref, tol));
1946 dref.
set_real(std::floor(d3.real()));
1949 TEST_ASSERT(d0.
nearly(dref, tol));
1953 dref.
set_real(std::floor(d3.real()));
1955 d0=std::floor(d1+d2);
1956 TEST_ASSERT(d0.
nearly(dref, tol));
1960 d4.
set_real(std::floor(d3.real()));
1964 d0=std::floor(std::floor(d1+d2));
1965 TEST_ASSERT(d0.
nearly(dref, tol));
1985 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
1992 TEST_ASSERT(d0.
nearly(dref, tol));
1997 dref.
set_nonreal(d3.nonreal()*((d3.real()<0)?(-1):(1)));
1999 TEST_ASSERT(d0.
nearly(dref, tol));
2004 d4.
set_nonreal(d3.nonreal()*((d3.real()<0)?(-1):(1)));
2008 TEST_ASSERT(d0.
nearly(dref, tol));
2015 TEST_ASSERT(d0.
nearly(dref, tol));
2022 TEST_ASSERT(d0.
nearly(dref, tol));
2030 d0=ceil(ceil(d1+d2));
2031 TEST_ASSERT(d0.
nearly(dref, tol));
2038 TEST_ASSERT(d0.
nearly(dref, tol));
2045 TEST_ASSERT(d0.
nearly(dref, tol));
2053 d0=floor(floor(d1+d2));
2054 TEST_ASSERT(d0.
nearly(dref, tol));
2074 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
2081 TEST_ASSERT(d0.
nearly(dref, tol));
2085 dref.
set_real(std::erf(d3.real()));
2088 TEST_ASSERT(d0.
nearly(dref, tol));
2096 d0=std::erf(std::erf(d1+d2));
2097 TEST_ASSERT(d0.
nearly(dref, tol));
2101 dref.
set_real(std::erfc(d3.real()));
2104 TEST_ASSERT(d0.
nearly(dref, tol));
2108 dref.
set_real(std::erfc(d3.real()));
2110 d0=std::erfc(d1+d2);
2111 TEST_ASSERT(d0.
nearly(dref, tol));
2119 d0=std::erfc(std::erfc(d1+d2));
2120 TEST_ASSERT(d0.
nearly(dref, tol));
2126 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
2133 TEST_ASSERT(d0.
nearly(dref, tol));
2140 TEST_ASSERT(d0.
nearly(dref, tol));
2149 TEST_ASSERT(d0.
nearly(dref, tol));
2156 TEST_ASSERT(d0.
nearly(dref, tol));
2163 TEST_ASSERT(d0.
nearly(dref, tol));
2171 d0=erfc(erfc(d1+d2));
2172 TEST_ASSERT(d0.
nearly(dref, tol));
2184 data__ tol(std::sqrt(std::numeric_limits<data__>::epsilon()));
2191 TEST_ASSERT(d0.
nearly(dref, tol));
2195 dref.
set_real(std::lgamma(d3.real()));
2197 d0=std::lgamma(d1+d2);
2198 TEST_ASSERT(d0.
nearly(dref, tol));
2202 d4.
set_real(std::lgamma(d3.real()));
2206 d0=std::erf(std::lgamma(d1+d2));
2207 TEST_ASSERT(d0.
nearly(dref, tol));
2211 dref.
set_real(std::erfc(d3.real()));
2214 TEST_ASSERT(d0.
nearly(dref, tol));
2218 dref.
set_real(std::erfc(d3.real()));
2220 d0=std::erfc(d1+d2);
2221 TEST_ASSERT(d0.
nearly(dref, tol));
2229 d0=std::erfc(std::erfc(d1+d2));
2230 TEST_ASSERT(d0.
nearly(dref, tol));
void dual_division_test()
Definition: ad_dual_test_suite.hpp:767
void dual_hyp_trig_nostd_test()
Definition: ad_dual_test_suite.hpp:1304
void dual_exp_test()
Definition: ad_dual_test_suite.hpp:1447
void dual_assignment_test()
Definition: ad_dual_test_suite.hpp:117
void dual_trig_test()
Definition: ad_dual_test_suite.hpp:886
void dual_erf_nostd_test()
Definition: ad_dual_test_suite.hpp:2123
void dual_gamma_test()
Definition: ad_dual_test_suite.hpp:2177
void set_nonreal(const data_type &nr)
Definition: dual_number.hpp:315
void dual_subtraction_test()
Definition: ad_dual_test_suite.hpp:545
void dual_power_nostd_test()
Definition: ad_dual_test_suite.hpp:1837
void AddTests(const float &)
Definition: ad_dual_test_suite.hpp:31
void dual_misc_test()
Definition: ad_dual_test_suite.hpp:1893
ad_dual_test_suite()
Definition: ad_dual_test_suite.hpp:107
data_type nonreal() const
Definition: dual_number.hpp:313
void dual_misc_nostd_test()
Definition: ad_dual_test_suite.hpp:1982
data_type real() const
Definition: dual_number.hpp:312
Definition: ad_dual_test_suite.hpp:28
void AddTests(const double &)
Definition: ad_dual_test_suite.hpp:56
bool exact(const data_type &d) const
Definition: dual_number.hpp:513
bool nearly(const data_type &d, const data_type &eps) const
Definition: dual_number.hpp:537
void set_real(const data_type &r)
Definition: dual_number.hpp:314
void dual_exact_comparison_test()
Definition: ad_dual_test_suite.hpp:148
void dual_trig_nostd_test()
Definition: ad_dual_test_suite.hpp:1023
void AddTests(const long double &)
Definition: ad_dual_test_suite.hpp:81
void dual_hyp_trig_test()
Definition: ad_dual_test_suite.hpp:1161
Definition: dual_number.hpp:28
void dual_addition_test()
Definition: ad_dual_test_suite.hpp:438
void dual_power_test()
Definition: ad_dual_test_suite.hpp:1781
void dual_multiplication_test()
Definition: ad_dual_test_suite.hpp:652
void dual_exp_nostd_test()
Definition: ad_dual_test_suite.hpp:1614
void dual_gamma_nostd_test()
Definition: ad_dual_test_suite.hpp:2234
void dual_erf_test()
Definition: ad_dual_test_suite.hpp:2071
void dual_inexact_comparison_test()
Definition: ad_dual_test_suite.hpp:210
~ad_dual_test_suite()
Definition: ad_dual_test_suite.hpp:112