aboutsummaryrefslogtreecommitdiff
path: root/double-error.c
diff options
context:
space:
mode:
Diffstat (limited to 'double-error.c')
-rw-r--r--double-error.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/double-error.c b/double-error.c
index dfbb34e..4e52b18 100644
--- a/double-error.c
+++ b/double-error.c
@@ -4,13 +4,18 @@
#include <float.h>
#include <stdbool.h>
-typedef double vtype;
-typedef double etype;
+typedef long double vtype;
+typedef long double etype;
#define EPS 2*DBL_EPSILON
#define MIN 2*DBL_MIN
typedef struct {vtype v; etype e;} double_error;
+vtype vabsolute(vtype v){
+ //return fabs(v);
+ return fabsl(v);
+}
+
double_error int_to_valuetype(int i){
double_error de;
de.v = (vtype) i;
@@ -33,7 +38,7 @@ bool exptype_is_infinite(double_error d){ return d.v == INFINITY; }
double_error sum(double_error de1, double_error de2){
double_error de;
de.v = de1.v + de2.v;
- de.e = de1.e + de2.e + ( fabs(de1.v) + fabs(de2.v) + de1.e + de2.e )*EPS + MIN;
+ de.e = de1.e + de2.e + ( vabsolute(de1.v) + vabsolute(de2.v) + de1.e + de2.e )*EPS + MIN;
return de;
}
@@ -45,11 +50,11 @@ double_error difference(double_error de1, double_error de2){
}
bool is_greater_certainly(double_error de1, double_error de2){
- return de1.v-de1.e > de2.v+de2.e + EPS*(fabs(de1.v)+fabs(de1.e)+fabs(de2.v)+fabs(de2.e)) + MIN;
+ return de1.v-de1.e > de2.v+de2.e + EPS*(vabsolute(de1.v)+vabsolute(de1.e)+vabsolute(de2.v)+vabsolute(de2.e)) + MIN;
}
bool is_greater_possibly(double_error de1, double_error de2){
- return de1.v+de1.e + EPS*(fabs(de1.v)+fabs(de1.e)+fabs(de2.v)+fabs(de2.e)) + MIN > de2.v-de2.e;
+ return de1.v+de1.e + EPS*(vabsolute(de1.v)+vabsolute(de1.e)+vabsolute(de2.v)+vabsolute(de2.e)) + MIN > de2.v-de2.e;
}
double_error maximum(double_error de1, double_error de2){
@@ -68,26 +73,26 @@ double_error maximum(double_error de1, double_error de2){
double_error product(double_error de1, double_error de2){
double_error de;
de.v = de1.v * de2.v;
- vtype p12 = fabs(de1.v)*de2.e*(1+EPS) + MIN;
- vtype p21 = fabs(de2.v)*de1.e*(1+EPS) + MIN;
+ vtype p12 = vabsolute(de1.v)*de2.e*(1+EPS) + MIN;
+ vtype p21 = vabsolute(de2.v)*de1.e*(1+EPS) + MIN;
vtype p22 = de1.e*de2.e*(1+EPS) + MIN;
etype s = (p12 + p21 + p22)*(1+2*EPS);
- de.e = s + ( fabs(de.v) + s )*EPS + MIN;
+ de.e = s + ( vabsolute(de.v) + s )*EPS + MIN;
return de;
}
double_error ratio(double_error de1, double_error de2){
double_error de2i;
de2i.v = 1/de2.v;
- if(de2.e > fabs(de2.v)/2) de2i.e = INFINITY;
- else de2i.e = 2*de2.e/(de2.v*de2.v) + fabs(de2i.v)*EPS + MIN; //2* is extra margin in case de2.e is near de2.v/2
+ if(de2.e > vabsolute(de2.v)/2) de2i.e = INFINITY;
+ else de2i.e = 2*de2.e/(de2.v*de2.v) + vabsolute(de2i.v)*EPS + MIN; //2* is extra margin in case de2.e is near de2.v/2
return product(de1,de2i);
}
double_error absolute(double_error de){
double_error dea;
- dea.v = fabs(de.v);
+ dea.v = vabsolute(de.v);
dea.e = de.e;
return dea;
}
@@ -134,9 +139,11 @@ int valuetype_to_string(char* s, double_error de){
if(de.e == 0.0){
/*If number really is an int, print accordingly to give cleaner output for example when printing the function itself, which often will be integer valued without errors.*/
if((vtype) ((int) de.v) == de.v) sprintf(s,"%d", (int)de.v);
- else sprintf(s,"%4.3f…",de.v);
+ //else sprintf(s,"%4.3f…",de.v);
+ else sprintf(s,"%4.3Lf…",de.v);
}
- else sprintf(s,"%4.3f… +/- %6.1e",de.v,de.e);
+ //else sprintf(s,"%4.3f… +/- %6.1e",de.v,de.e);
+ else sprintf(s,"%4.3Lf… +/- %6.1e",de.v,de.e);
return 0;
}
@@ -149,9 +156,11 @@ int valuetype_to_latex(char* s, double_error de){
if(de.e == 0.0){
/*If number really is an int, print accordingly to give cleaner output for example when printing the function itself, which often will be integer valued without errors.*/
if((vtype) ((int) de.v) == de.v) sprintf(s,"%d", (int)de.v);
- else sprintf(s,"%4.3f\\ldots",de.v);
+ //else sprintf(s,"%4.3f\\ldots",de.v);
+ else sprintf(s,"%4.3Lf\\ldots",de.v);
}
- else sprintf(s,"%4.3f\\ldots\\pm\\texttt{%1.0e}",de.v,de.e);
+ //else sprintf(s,"%4.3f\\ldots\\pm\\texttt{%1.0e}",de.v,de.e);
+ else sprintf(s,"%4.3Lf\\ldots\\pm\\texttt{%1.0e}",de.v,de.e);
return 0;
}