OpenLexocad  27.1
DualNumber.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (c) 2019 Viktor Titov (DeepSOIC) <vv.titov@gmail.com> *
3  * *
4  * This file is part of the FreeCAD CAx development system. *
5  * *
6  * This library is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU Library General Public *
8  * License as published by the Free Software Foundation; either *
9  * version 2 of the License, or (at your option) any later version. *
10  * *
11  * This library is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU Library General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU Library General Public *
17  * License along with this library; see the file COPYING.LIB. If not, *
18  * write to the Free Software Foundation, Inc., 59 Temple Place, *
19  * Suite 330, Boston, MA 02111-1307, USA *
20  * *
21  ***************************************************************************/
22 
23 #ifndef FREECAD_BASE_DUAL_NUMBER_H
24 #define FREECAD_BASE_DUAL_NUMBER_H
25 
26 #include <cmath>
27 
28 namespace Base {
29 
30 
39 {
40 public:
41  double re = 0.0;
42  double du = 0.0;
43 public:
45  DualNumber(double re, double du = 0.0)
46  : re(re), du(du)
47  {}
48  DualNumber operator-() const {return DualNumber(-re,-du);}
49 };
50 
52  return DualNumber(a.re + b.re, a.du + b.du);
53 }
54 inline DualNumber operator+(DualNumber a, double b){
55  return DualNumber(a.re + b, a.du);
56 }
57 inline DualNumber operator+(double a, DualNumber b){
58  return DualNumber(a + b.re, b.du);
59 }
60 
62  return DualNumber(a.re - b.re, a.du - b.du);
63 }
64 inline DualNumber operator-(DualNumber a, double b){
65  return DualNumber(a.re - b, a.du);
66 }
67 inline DualNumber operator-(double a, DualNumber b){
68  return DualNumber(a - b.re, -b.du);
69 }
70 
72  return DualNumber(a.re * b.re, a.re * b.du + a.du * b.re);
73 }
74 inline DualNumber operator*(double a, DualNumber b){
75  return DualNumber(a * b.re, a * b.du);
76 }
77 inline DualNumber operator*(DualNumber a, double b){
78  return DualNumber(a.re * b, a.du * b);
79 }
80 
82  return DualNumber(a.re / b.re, (a.du * b.re - a.re * b.du) / (b.re * b.re));
83 }
84 inline DualNumber operator/(DualNumber a, double b){
85  return DualNumber(a.re / b, a.du / b);
86 }
87 
88 inline DualNumber pow(DualNumber a, double pw){
89  return Base::DualNumber(std::pow(a.re, pw), pw * std::pow(a.re, pw - 1.0) * a.du);
90 }
91 } //namespace
92 
93 
94 #endif
double du
Definition: DualNumber.h:42
DualNumber operator-(DualNumber a, DualNumber b)
Definition: DualNumber.h:61
Dual Numbers aer 2-part numbers like complex numbers, but different algebra. They are denoted as a + ...
Definition: DualNumber.h:38
double re
Definition: DualNumber.h:41
DualNumber operator+(DualNumber a, DualNumber b)
Definition: DualNumber.h:51
DualNumber operator-() const
Definition: DualNumber.h:48
DualNumber()
Definition: DualNumber.h:44
Definition: AbstractXMLReader.h:5
DualNumber(double re, double du=0.0)
Definition: DualNumber.h:45
DualNumber operator *(DualNumber a, DualNumber b)
Definition: DualNumber.h:71
DualNumber pow(DualNumber a, double pw)
Definition: DualNumber.h:88
DualNumber operator/(DualNumber a, DualNumber b)
Definition: DualNumber.h:81