Круглые числа ранее (сравните) заявление
шкала на 100000, раунд до целого числа, а затем сравнить.
Не нужно делиться масштабированием и вводить больше вычислительных ошибок для сравнения.
#include <math.h>
int compare_rounded(double a, double b, double scale) {
// or use round(), nearby()
a = rint(a*scale);
b = rint(b*scale);
return (a > b) - (a < b);
}
ИЛИ, возможно, более просто вычитать. Это дает несколько разные результаты. Все зависит от того, что хочет OP.
int compare_rounded2(double a, double b, double guard) {
double diff = a-b;
if (diff < -guard) return -1;
return diff > guard;
}
затем вызвать одну из 2
double s =d/a;
double s1 =d1/a1;
int cmp = compare_rounded(s1,s, 100000.0);
// or
int cmp = compare_rounded2(s1,s, 100000.0);
if (cmp > 0) {
puts("S1 > S");
} else if (cmp == 0) {
puts("S1 == S");
} else {
puts("S1 < S");
}
Чтобы справиться с обоими номерами около того же предела double
как DBL_MAX
, дополнительный код требуется, это первая функция из-за переполнения a*scale
.
Возможный дубликат [Что является лучшим способом сравнения поплавков для почти равенства в Python?] (Http://stackoverflow.com/questions/5595425/what-is-the-best-way-to-compare- floats-for-почти-equal-in-python) – woockashek