summaryrefslogtreecommitdiff
path: root/double-error.c
diff options
context:
space:
mode:
authorJulian Weigt <juw@posteo.de>2026-01-15 21:17:07 +0100
committerJulian Weigt <juw@posteo.de>2026-02-04 15:55:52 +0100
commitd78cc5836306c3231bb958bffe88ce54c898b512 (patch)
treed26da095166ce52ebda1cb59966c84b9d03b1200 /double-error.c
parent8e5bf1e894d36ee939653da7bf029f7a10f002d6 (diff)
Introduce is_greater_certainly and is_greater_possibly to make more robust the printing and finding of records.
Start reorganizing to allow eventual printing of all records.
Diffstat (limited to 'double-error.c')
-rw-r--r--double-error.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/double-error.c b/double-error.c
index e166ec0..16c7e1e 100644
--- a/double-error.c
+++ b/double-error.c
@@ -41,21 +41,25 @@ double_error difference(double_error de1, double_error de2){
return sum(de1,de2m);
}
-bool is_greater(double_error de1, double_error de2){ return ((1+EPS)*(de1.v+de1.e) > de2.v-de2.e); }
+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)) + DBL_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)) + DBL_MIN > de2.v-de2.e;
+}
double_error maximum(double_error de1, double_error de2){
- double_error de;
- double max1 = de1.v + de1.e;
- double max2 = de2.v + de2.e;
- if( max1 >= max2 ){
- de.v = de1.v;
- de.e = de1.e + max1*EPS + DBL_MIN;
- } else {
- de.v = de2.v;
- de.e = de2.e + max2*EPS + DBL_MIN;
+ if(is_greater_certainly(de1,de2)) return de1;
+ else if(is_greater_certainly(de2,de1)) return de2;
+ else{
+ double_error de;
+ if( de1.v >= de2.v ) de.v = de1.v;
+ else de.v = de2.v;
+ if( de1.e >= de2.e ) de.e = de1.e;
+ else de.e = de2.e;
+ return de;
}
-
- return de;
}
double_error product(double_error de1, double_error de2){