summaryrefslogtreecommitdiff
path: root/double-error.c
diff options
context:
space:
mode:
Diffstat (limited to 'double-error.c')
-rw-r--r--double-error.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/double-error.c b/double-error.c
index 9490671..8df0974 100644
--- a/double-error.c
+++ b/double-error.c
@@ -16,13 +16,17 @@ double_error int_to_valuetype(int i){
return de;
}
-double_error int_to_exptype(double d){
+double_error int_to_exptype(int i){ return int_to_valuetype(i); }
+
+double_error infinity_to_exptype(){
double_error de;
- de.v = d;
- de.e = EPS*fabs(d) + DBL_MIN;
+ de.v = INFINITY;
+ de.e = 0;
return de;
}
+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;
@@ -113,27 +117,45 @@ double valuetype_to_double(double_error de){ return de.v; }
double exptype_to_double(double_error de){ return de.v; }
int valuetype_to_string(char* s, double_error de){
- sprintf(s,"%f… +/- %6.1e",de.v,de.e);
+ if(de.e == 0.0){
+ if(de.v == 0.0 || de.v == 1.0 || de.v == 2.0 || de.v == 4.0 || de.v == 8.0 || de.v == 16.0) sprintf(s,"%d", (int)de.v);
+ else sprintf(s,"%4.3f…",de.v);
+ }
+ else sprintf(s,"%4.3f… +/- %6.1e",de.v,de.e);
return 0;
}
+int exptype_to_string(char* s, double_error de){
+ if(exptype_is_infinite(de)) return sprintf(s,"inf");
+ else return valuetype_to_string(s,de);
+}
+
int valuetype_to_latex(char* s, double_error de){
if(de.e == 0.0){
- if(de.v == 0.0) sprintf(s,"$0$");
- else if(de.v == 1.0) sprintf(s,"$1$");
+ if(de.v == 0.0 || de.v == 1.0 || de.v == 2.0 || de.v == 4.0 || de.v == 8.0 || de.v == 16.0) sprintf(s,"%d", (int)de.v);
+ else sprintf(s,"%4.3f\\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);
return 0;
}
+int exptype_to_latex(char* s, double_error de){
+ if(exptype_is_infinite(de)) return sprintf(s,"\\infty");
+ else return valuetype_to_latex(s,de);
+}
+
int root_to_string(char* s, double_error de, double_error p){
- double_error de1p = power(de,ratio(int_to_valuetype(1),p));
+ double_error de1p;
+ if(exptype_is_infinite(p)) de1p = de;
+ else de1p = power(de,ratio(int_to_valuetype(1),p));
valuetype_to_string(s,de1p);
return 0;
}
int root_to_latex(char* s, double_error de, double_error p){
- double_error de1p = power(de,ratio(int_to_valuetype(1),p));
+ double_error de1p;
+ if(exptype_is_infinite(p)) de1p = de;
+ else de1p = power(de,ratio(int_to_valuetype(1),p));
valuetype_to_latex(s,de1p);
return 0;
}