-
Notifications
You must be signed in to change notification settings - Fork 0
/
hyperdual.hpp
124 lines (105 loc) · 4.22 KB
/
hyperdual.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
* Class: HyperDual
*
* Implementation of a class where i^2 = j^2 = (ij)^2 = 0
* instead of quaternions where i^2 = j^2 = k^2 = -1
*
* Only functions required by rangeboom.cpp and JOE have been implemented so far
* Notes on some functions:
* pow(x,a) uses a small tolerance value, tol, to avoid division by zero
* Warning: This is not yet implemented in other functions such as asin
* fabs(x) uses simply -x if x<0, ignoring derivative discontinuities at x=0
*
* Written by: Jeffrey Fike
* Stanford University, Department of Aeronautics and Astronautics
*
* Last modified: 2/26/09 1:45 pm
* Added "<<" and unary "+" operators in order to compile JOE
* Added "const" in the appropriate functions in order to compile JOE
* Broke into .h and .cpp in order to compile JOE
*
* Last modified: 10/22/10 11:15 am
* Added acos function
*/
#pragma once
#include <iostream>
//#include <math.h>
//using namespace std;
using std::ostream;
class HyperDual{
double f0,f1,f2,f12;
public:
//create new and set values
HyperDual();
HyperDual(double x1,double x2,double x3,double x4);
HyperDual(double x1);
void setvalues(double x1,double x2,double x3,double x4);
//examine values
void view(void);
const double & realpart(void) const;
const double & ipart(void) const;
const double & jpart(void) const;
const double & ijpart(void) const;
// set values
double & realpart(void);
double & ipart(void);
double & jpart(void);
double & ijpart(void);
//basic manipulation
//do not need to overload = operator? fq=fq and fq=double seem to work
HyperDual operator+ () const;
HyperDual operator+ (const HyperDual rhs) const;
friend HyperDual operator+ (const double lhs, const HyperDual rhs);
HyperDual operator- () const;
HyperDual operator- (const HyperDual rhs) const;
friend HyperDual operator- (const double lhs, const HyperDual rhs);
HyperDual operator* (const HyperDual rhs)const;
friend HyperDual operator* (const double lhs, const HyperDual rhs);
friend HyperDual operator/ (const HyperDual lhs, const HyperDual rhs);
friend HyperDual operator/ (const double lhs, const HyperDual rhs);
friend HyperDual operator/ (const HyperDual lhs, const double rhs);
HyperDual& operator+= (HyperDual rhs);
HyperDual& operator-= (HyperDual rhs);
HyperDual& operator*= (HyperDual rhs);
HyperDual& operator*= (double rhs);
HyperDual& operator/= (double rhs);
//math.h functions
friend HyperDual pow (HyperDual x, double a);
friend HyperDual pow (HyperDual x, HyperDual a);
friend HyperDual exp(HyperDual x);
friend HyperDual log(HyperDual x);
friend HyperDual sin(HyperDual x);
friend HyperDual cos(HyperDual x);
friend HyperDual tan(HyperDual x);
friend HyperDual asin(HyperDual x);
friend HyperDual acos(HyperDual x);
friend HyperDual atan(HyperDual x);
friend HyperDual sqrt(HyperDual x);
friend HyperDual fabs(HyperDual x);
friend HyperDual max(HyperDual x1, HyperDual x2);
friend HyperDual max(HyperDual x1, double x2);
friend HyperDual max(double x1, HyperDual x2);
friend HyperDual min(HyperDual x1, HyperDual x2);
friend HyperDual min(HyperDual x1, double x2);
friend HyperDual min(double x1, HyperDual x2);
//comparisons
friend bool operator> (HyperDual lhs, HyperDual rhs);
friend bool operator> (double lhs, HyperDual rhs);
friend bool operator> (HyperDual lhs, double rhs);
friend bool operator>= (HyperDual lhs, HyperDual rhs);
friend bool operator>= (double lhs, HyperDual rhs);
friend bool operator>= (HyperDual lhs, double rhs);
friend bool operator< (HyperDual lhs, HyperDual rhs);
friend bool operator< (double lhs, HyperDual rhs);
friend bool operator< (HyperDual lhs, double rhs);
friend bool operator<= (HyperDual lhs, HyperDual rhs);
friend bool operator<= (double lhs, HyperDual rhs);
friend bool operator<= (HyperDual lhs, double rhs);
friend bool operator== (HyperDual lhs, HyperDual rhs);
friend bool operator== (double lhs, HyperDual rhs);
friend bool operator== (HyperDual lhs, double rhs);
friend bool operator!= (HyperDual lhs, HyperDual rhs);
friend bool operator!= (double lhs, HyperDual rhs);
friend bool operator!= (HyperDual lhs, double rhs);
friend ostream& operator<<(ostream& output, const HyperDual& rhs);
};