13 #ifndef eli_mutil_ad_dual_number_hpp
14 #define eli_mutil_ad_dual_number_hpp
16 #include "eli/code_eli.hpp"
28 template<
typename data__,
bool comp_real_only>
class dual;
35 template <
typename data__>
42 const data_type &
val;
54 template <
typename T__,
bool comp_real_only>
65 const data_type
real()
const {
return expr.real();}
66 const data_type
nonreal()
const {
return expr.nonreal();}
96 bool operator<=(const expression<T__, comp_real_only> &e)
const
108 bool operator<(const expression<T__, comp_real_only> &e)
const
145 # pragma warning(push)
146 # pragma warning(disable: 4244)
148 template <
typename data2__,
typename data__,
bool comp_real_only>
153 template <
typename data2__,
typename data__,
bool comp_real_only>
158 template <
typename data2__,
typename data__,
bool comp_real_only>
159 bool operator<=(const data2__ &v, const eli::mutil::ad::dual_number::expression<data__, comp_real_only> &e)
163 template <
typename data2__,
typename data__,
bool comp_real_only>
164 bool operator<(const data2__ &v, const eli::mutil::ad::dual_number::expression<data__, comp_real_only> &e)
168 template <
typename data2__,
typename data__,
bool comp_real_only>
173 template <
typename data2__,
typename data__,
bool comp_real_only>
179 # pragma warning(pop)
188 template <
typename data__,
bool comp_real_only>
206 bool nearly_equiv(
const data__ &r,
const data__ &nr,
const data__ &eps)
const
208 data__ rdif(val[0]-r), nrdif(val[1]-nr);
209 if (std::abs(rdif)>eps)
211 if (std::abs(nrdif)>eps)
273 val[0]=
static_cast<data_type
>(0);
274 val[1]=
static_cast<data_type
>(0);
281 val[1]=
static_cast<data_type
>(0);
284 dual(
const data_type &v1,
const data_type &v2)
296 template<
typename data2__>
303 template<
typename data2__>
312 data_type
real()
const {
return val[0];}
320 val[1]=
static_cast<data_type
>(0);
335 template <
typename data2__>
347 template <
typename data2__>
354 template <
typename data2__>
374 template <
typename data2__>
381 template <
typename data2__>
387 template <
typename data2__>
407 template <
typename data2__>
414 template <
typename data2__>
420 template <
typename data2__>
437 data_type val0(val[0]);
439 val[0]=val0*d.real();
440 val[1]=val0*d.nonreal()+val[1]*d.real();
443 template <
typename data2__>
446 data_type val0(val[0]);
448 val[0]=val0*d.real();
449 val[1]=val0*d.nonreal()+val[1]*d.real();
452 template <
typename data2__>
459 template <
typename data2__>
462 data_type val0(val[0]);
464 val[0]=val0*e.
real();
478 data_type val0(val[0]);
479 data_type c(d.real());
481 val[0]=val0/d.real();
482 val[1]=(val[1]*c-val0*d.nonreal())/c/c;
485 template <
typename data2__>
488 data_type val0(val[0]);
491 val[0]=val0/d.real();
492 val[1]=(val[1]*c-val0*d.nonreal())/c/c;
495 template <
typename data2__>
502 template <
typename data2__>
505 data_type val0(val[0]);
508 val[0]=val0/e.
real();
509 val[1]=(val[1]*c-val0*e.
nonreal())/c/c;
513 bool exact(
const data_type &d)
const
521 template <
typename data2__>
526 template <
typename data2__>
531 template <
typename data2__>
537 bool nearly(
const data_type &d,
const data_type &eps)
const
545 template <
typename data2__>
550 template <
typename data2__>
555 template <
typename data2__>
576 template <
typename data2__>
584 template <
typename data2__>
589 template <
typename data2__>
607 template <
typename data2__>
612 template <
typename data2__>
617 template <
typename data2__>
631 bool operator<=(const dual<data_type, comp_real_only> &d)
const
638 template <
typename data2__>
639 bool operator<=(const dual<data2__, comp_real_only> &d)
const
646 template <
typename data2__>
647 bool operator<=(const dual_number::constant<data2__> &c)
const
651 template <
typename data2__>
652 bool operator<=(const dual_number::expression<data2__, comp_real_only> &e)
const
668 bool operator<(const dual<data_type, comp_real_only> &d)
const
675 template <
typename data2__>
676 bool operator<(const dual<data2__, comp_real_only> &d)
const
683 template <
typename data2__>
684 bool operator<(const dual_number::constant<data2__> &c)
const
688 template <
typename data2__>
689 bool operator<(const dual_number::expression<data2__, comp_real_only> &e)
const
712 template <
typename data2__>
720 template <
typename data2__>
725 template <
typename data2__>
749 template <
typename data2__>
757 template <
typename data2__>
762 template <
typename data2__>
773 str << val[0] <<
" + " << val[1] <<
"ε";
799 # pragma warning(push)
800 # pragma warning(disable: 4244)
804 template <
typename data2__,
typename data__,
bool comp_real_only>
809 template <
typename data2__,
typename data__,
bool comp_real_only>
814 template <
typename data2__,
typename data__,
bool comp_real_only>
815 bool operator<=(const data2__ &v, const eli::mutil::ad::dual<data__, comp_real_only> &d)
819 template <
typename data2__,
typename data__,
bool comp_real_only>
820 bool operator<(const data2__ &v, const eli::mutil::ad::dual<data__, comp_real_only> &d)
824 template <
typename data2__,
typename data__,
bool comp_real_only>
829 template <
typename data2__,
typename data__,
bool comp_real_only>
834 template <
typename data2__,
typename data__,
bool comp_real_only>
839 template <
typename data2__,
typename data__,
bool comp_real_only>
844 template <
typename data2__,
typename data__,
bool comp_real_only>
849 template <
typename data2__,
typename data__,
bool comp_real_only>
854 template <
typename data2__,
typename data__,
bool comp_real_only>
859 template <
typename data2__,
typename data__,
bool comp_real_only>
864 template <
typename data2__,
typename data__,
bool comp_real_only>
869 template <
typename data2__,
typename data__,
bool comp_real_only>
874 template <
typename data2__,
typename data__,
bool comp_real_only>
879 template <
typename data2__,
typename data__,
bool comp_real_only>
884 template <
typename data2__,
typename data__,
bool comp_real_only>
889 template <
typename data2__,
typename data__,
bool comp_real_only>
895 # pragma warning(pop)
899 template <
typename data__,
bool comp_real_only>
900 std::ostream & operator<<(std::ostream &ostr, const eli::mutil::ad::dual<data__, comp_real_only> &d)
906 template <
typename data__,
bool comp_real_only>
907 std::ostream & operator<<(std::ostream &ostr, const eli::mutil::ad::dual_number::expression<data__, comp_real_only> &e)
916 template <
typename data__,
bool comp_real_only>
bool operator!=(const data_type &d) const
Definition: dual_number.hpp:599
dual< data_type, comp_real_only > & operator/=(const dual< data2__, comp_real_only > &d)
Definition: dual_number.hpp:486
dual< data_type, comp_real_only > & operator/=(const dual< data_type, comp_real_only > &d)
Definition: dual_number.hpp:476
dual< data_type, comp_real_only > & operator-=(const data_type &d)
Definition: dual_number.hpp:396
bool operator>=(const dual< data2__, comp_real_only > &d) const
Definition: dual_number.hpp:713
bool nearly(const dual_number::expression< data2__, comp_real_only > &e, const data_type &eps) const
Definition: dual_number.hpp:556
bool operator>=(const dual_number::expression< data2__, comp_real_only > &e) const
Definition: dual_number.hpp:726
bool nearly(const dual_number::constant< data2__ > &c, const data_type &eps) const
Definition: dual_number.hpp:551
void input(std::istream &)
Definition: dual_number.hpp:777
bool nearly_equiv(const data__ &r, const data__ &nr, const data__ &eps) const
Definition: dual_number.hpp:206
bool exact(const dual< data2__, comp_real_only > &d) const
Definition: dual_number.hpp:522
dual(const dual< data_type, comp_real_only > &d)
Definition: dual_number.hpp:290
dual< data_type, comp_real_only > & operator=(const dual< data2__, comp_real_only > &d)
Definition: dual_number.hpp:336
bool operator==(const dual< data_type, comp_real_only > &d) const
Definition: dual_number.hpp:569
bool exact_less_than(const data__ &, const data__ &) const
Definition: dual_number.hpp:216
bool operator==(const data_type &v) const
Definition: dual_number.hpp:69
dual< data_type, comp_real_only > & operator=(const dual< data_type, comp_real_only > &d)
Definition: dual_number.hpp:324
dual< data_type, comp_real_only > & operator*=(const dual_number::expression< data2__, comp_real_only > &e)
Definition: dual_number.hpp:460
expression(const T__ &e)
Definition: dual_number.hpp:63
dual(const data__ &v)
Definition: dual_number.hpp:278
data__ data_type
Definition: dual_number.hpp:192
~dual()
Definition: dual_number.hpp:310
Definition: dual_number.hpp:55
dual< data_type, comp_real_only > & operator*=(const data_type &d)
Definition: dual_number.hpp:429
bool operator>(const expression< T__, comp_real_only > &e) const
Definition: dual_number.hpp:132
T__::data_type data_type
Definition: dual_number.hpp:61
void set_nonreal(const data_type &nr)
Definition: dual_number.hpp:315
void read(std::istream &)
Definition: dual_number.hpp:789
bool operator!=(const data_type &v) const
Definition: dual_number.hpp:81
const data_type & val
Definition: dual_number.hpp:42
dual< data_type, comp_real_only > & operator=(const data_type &v)
Definition: dual_number.hpp:317
dual< data_type, comp_real_only > & operator-=(const dual_number::expression< data2__, comp_real_only > &e)
Definition: dual_number.hpp:421
bool operator>=(const dual< data_type, comp_real_only > &d) const
Definition: dual_number.hpp:705
dual< data_type, comp_real_only > & operator-=(const dual< data2__, comp_real_only > &d)
Definition: dual_number.hpp:408
data_type nonreal() const
Definition: dual_number.hpp:313
bool exact_greater_than(const data__ &, const data__ &) const
Definition: dual_number.hpp:230
bool exact(const dual_number::constant< data2__ > &c) const
Definition: dual_number.hpp:527
dual< data_type, comp_real_only > & operator-=(const dual< data_type, comp_real_only > &d)
Definition: dual_number.hpp:401
dual()
Definition: dual_number.hpp:270
dual< data_type, comp_real_only > & operator+=(const data_type &d)
Definition: dual_number.hpp:363
bool inexact_less_than_equal(const data__ &r) const
Definition: dual_number.hpp:254
bool operator==(const data2__ &v, const eli::mutil::ad::dual_number::expression< data__, comp_real_only > &e)
Definition: dual_number.hpp:149
Definition: dual_number.hpp:36
data_type real() const
Definition: dual_number.hpp:312
bool exact_equiv(const data__ &r, const data__ &nr) const
Definition: dual_number.hpp:198
dual< data_type, comp_real_only > & operator+=(const dual_number::constant< data2__ > &c)
Definition: dual_number.hpp:382
bool operator==(const dual_number::expression< data2__, comp_real_only > &e) const
Definition: dual_number.hpp:590
data__ val[2]
Definition: dual_number.hpp:195
bool operator>(const data2__ &v, const eli::mutil::ad::dual_number::expression< data__, comp_real_only > &e)
Definition: dual_number.hpp:174
bool operator!=(const data2__ &v, const eli::mutil::ad::dual_number::expression< data__, comp_real_only > &e)
Definition: dual_number.hpp:154
bool operator>(const dual< data_type, comp_real_only > &d) const
Definition: dual_number.hpp:742
constant(const data_type &v)
Definition: dual_number.hpp:45
dual< data_type, comp_real_only > & operator*=(const dual_number::constant< data2__ > &c)
Definition: dual_number.hpp:453
bool operator>(const data_type &v) const
Definition: dual_number.hpp:127
bool inexact_greater_than_equal(const data__ &r) const
Definition: dual_number.hpp:264
dual< data_type, comp_real_only > & operator/=(const dual_number::constant< data2__ > &c)
Definition: dual_number.hpp:496
dual< data_type, comp_real_only > & operator/=(const data_type &d)
Definition: dual_number.hpp:470
dual< data_type, comp_real_only > & operator*=(const dual< data_type, comp_real_only > &d)
Definition: dual_number.hpp:435
dual(const dual_number::expression< data2__, comp_real_only > &c)
Definition: dual_number.hpp:304
bool exact(const data_type &d) const
Definition: dual_number.hpp:513
bool operator<=(const data_type &v) const
Definition: dual_number.hpp:91
void print(std::ostream &str) const
Definition: dual_number.hpp:771
bool nearly(const data_type &d, const data_type &eps) const
Definition: dual_number.hpp:537
bool inexact_equiv(const data__ &r) const
Definition: dual_number.hpp:244
void set_real(const data_type &r)
Definition: dual_number.hpp:314
bool operator!=(const expression< T__, comp_real_only > &e) const
Definition: dual_number.hpp:85
bool operator>(const dual_number::expression< data2__, comp_real_only > &e) const
Definition: dual_number.hpp:763
bool operator>=(const data_type &v) const
Definition: dual_number.hpp:115
bool inexact_less_than(const data__ &r) const
Definition: dual_number.hpp:249
dual< data_type, comp_real_only > & operator+=(const dual_number::expression< data2__, comp_real_only > &e)
Definition: dual_number.hpp:388
bool operator>(const data_type &d) const
Definition: dual_number.hpp:735
bool operator<(const data_type &d) const
Definition: dual_number.hpp:661
bool operator!=(const dual< data2__, comp_real_only > &d) const
Definition: dual_number.hpp:608
bool operator>=(const dual_number::constant< data2__ > &c) const
Definition: dual_number.hpp:721
bool exact_greater_than_equal(const data__ &, const data__ &) const
Definition: dual_number.hpp:237
dual< data_type, comp_real_only > & operator+=(const dual< data_type, comp_real_only > &d)
Definition: dual_number.hpp:368
dual< data_type, comp_real_only > & operator=(const dual_number::constant< data2__ > &c)
Definition: dual_number.hpp:348
Definition: dual_number.hpp:28
std::istream & operator>>(std::istream &istr, eli::mutil::ad::dual< data__, comp_real_only > &d)
Definition: dual_number.hpp:917
const T__ expr
Definition: dual_number.hpp:58
dual(const data_type &v1, const data_type &v2)
Definition: dual_number.hpp:284
dual< data_type, comp_real_only > & operator+=(const dual< data2__, comp_real_only > &d)
Definition: dual_number.hpp:375
bool operator==(const data_type &d) const
Definition: dual_number.hpp:562
bool operator!=(const dual_number::constant< data2__ > &c) const
Definition: dual_number.hpp:613
bool operator==(const dual_number::constant< data2__ > &c) const
Definition: dual_number.hpp:585
bool nearly(const dual< data2__, comp_real_only > &d, const data_type &eps) const
Definition: dual_number.hpp:546
dual< data_type, comp_real_only > & operator-=(const dual_number::constant< data2__ > &c)
Definition: dual_number.hpp:415
dual(const dual_number::constant< data2__ > &c)
Definition: dual_number.hpp:297
bool operator>=(const expression< T__, comp_real_only > &e) const
Definition: dual_number.hpp:120
bool nearly(const dual< data_type, comp_real_only > &d, const data_type &eps) const
Definition: dual_number.hpp:541
void write(std::ostream &) const
Definition: dual_number.hpp:783
bool operator>=(const data2__ &v, const eli::mutil::ad::dual_number::expression< data__, comp_real_only > &e)
Definition: dual_number.hpp:169
bool inexact_greater_than(const data__ &r) const
Definition: dual_number.hpp:259
bool exact(const dual< data_type, comp_real_only > &d) const
Definition: dual_number.hpp:517
dual< data_type, comp_real_only > & operator=(const dual_number::expression< data2__, comp_real_only > &c)
Definition: dual_number.hpp:355
const data_type nonreal() const
Definition: dual_number.hpp:66
bool operator!=(const dual< data_type, comp_real_only > &d) const
Definition: dual_number.hpp:603
data_type nonreal() const
Definition: dual_number.hpp:48
bool exact(const dual_number::expression< data2__, comp_real_only > &e) const
Definition: dual_number.hpp:532
bool exact_less_than_equal(const data__ &, const data__ &) const
Definition: dual_number.hpp:223
data_type real() const
Definition: dual_number.hpp:47
bool operator>=(const data_type &d) const
Definition: dual_number.hpp:698
dual< data_type, comp_real_only > & operator*=(const dual< data2__, comp_real_only > &d)
Definition: dual_number.hpp:444
bool operator<(const data_type &v) const
Definition: dual_number.hpp:103
dual< data_type, comp_real_only > & operator/=(const dual_number::expression< data2__, comp_real_only > &e)
Definition: dual_number.hpp:503
const data_type real() const
Definition: dual_number.hpp:65
bool operator!=(const dual_number::expression< data2__, comp_real_only > &e) const
Definition: dual_number.hpp:618
data__ data_type
Definition: dual_number.hpp:39
bool operator>(const dual_number::constant< data2__ > &c) const
Definition: dual_number.hpp:758
bool operator==(const expression< T__, comp_real_only > &e) const
Definition: dual_number.hpp:74
bool operator==(const dual< data2__, comp_real_only > &d) const
Definition: dual_number.hpp:577
bool operator<=(const data_type &d) const
Definition: dual_number.hpp:624
bool operator>(const dual< data2__, comp_real_only > &d) const
Definition: dual_number.hpp:750