summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Weigt <juw@posteo.de>2025-12-28 12:32:08 +0000
committerJulian Weigt <juw@posteo.de>2026-02-04 15:55:48 +0100
commit8d4017f56a07f9e02c4c78382a180874bb6eeeea (patch)
treedafc4d91840982ae47f4467a04058d1490538648
parent828654f79fa3e38e99319250de25350109786320 (diff)
Start trying to handle also egde and big error cases in error handling.
-rw-r--r--double-error.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/double-error.c b/double-error.c
index 4cd1406..a918cff 100644
--- a/double-error.c
+++ b/double-error.c
@@ -17,14 +17,14 @@ double_error convert_int(int i){
double_error to_exptype(double d){
double_error de;
de.d = d;
- de.e = EPS*fabs(d);
+ de.e = max(EPS*fabs(d),DBL_MIN);
return de;
}
double_error sum(double_error de1, double_error de2){
double_error de;
de.d = de1.d + de2.d;
- de.e = de1.e + de2.e + ( fabs(de1.d) + fabs(de2.d) + de1.e + de2.e )*EPS;
+ de.e = de1.e + de2.e + ( fabs(de1.d) + fabs(de2.d) + de1.e + de2.e )*EPS + DBL_MIN;
return de;
}
@@ -43,10 +43,10 @@ double_error maximum(double_error de1, double_error de2){
double max2 = de2.d+de2.e;
if( max1 >= max2 ){
de.d = de1.d;
- de.e = de1.e + max1*EPS;
+ de.e = de1.e + max1*EPS + DBL_MIN;
} else {
- de.d = de2.d;
- de.e = de2.e + max2*EPS;
+ de.d = de2.d;
+ de.e = de2.e + max2*EPS + DBL_MIN;
}
return de;
@@ -59,14 +59,15 @@ double_error product(double_error de1, double_error de2){
double p21 = fabs(de2.d)*de1.e;
double p22 = de1.e+de2.e;
double s = p12 + p21 + p22;
- de.e = s + ( fabs(de.d) + s )*EPS;
+ de.e = s + ( fabs(de.d) + s )*EPS + DBL_MIN;
return de;
}
double_error ratio(double_error de1, double_error de2){
double_error de2i;
de2i.d = 1/de2.d;
- de2i.e = 2*de2.e/(de2.d*de2.d) + fabs(de2i.d)*EPS; //2* is random extra margin in case error is large
+ if(de2.e > de2.d/2) de2i.e = INFINITY;
+ else de2i.e = 2*de2.e/(de2.d*de2.d) + fabs(de2i.d)*EPS + DBL_MIN; //2* is extra margin in case de2.e is near de2.d/2
return product(de1,de2i);
}
@@ -85,7 +86,7 @@ double_error power(double_error de, double_error p) {
dep.e = 2*fabs(dep.d)*( de.e/fabs(de.d) + p.e/fabs(p.d) + EPS ); //again random 2*
}
else {
- dep.e = de.e + EPS;
+ dep.e = de.e;
}
return dep;
}