Как я понимаю, значения типов с плавающей запятой следует тщательно сравнивать, чтобы избежать проблем с присущими ошибками с плавающей запятой. Это можно улучшить, сравнивая значения с порогом ошибки.Сравнение значений float и double с дельта?
Например, следующее решение является более удобным для использования, чем простой тест: x == y
static float CompareRelativeError(float x, float y) {
return Math.Abs(x - y)/Math.Max(Math.Abs(x), Math.Abs(y));
}
static bool CompareAlmostEqual(float x, float y, float delta) {
return x == y || CompareRelativeError(x, y) < delta;
}
// apologies if this is a poor example
if (CompareAlmostEqual(1f/10f, 0.1f)) { ... }
Полученный раствор был получен из следующего ресурса: Is it safe when compare 2 float/double directly in Java?
В то время как я не был в состоянии найти литературу, чтобы подтвердить это, мне кажется, что то же самое должно быть справедливо для сравнений, таких как x > y
. Например, если x
и y
практически равны, как можно быть больше, чем другие ...
static bool CompareGreater(float x, float y, float delta) {
return x > y && !CompareAlmostEqual(x, y, delta);
}
И, таким образом, следующий будет действительным для x >= y
:
static bool CompareGreaterOrEqual(float x, float y) {
return x >= y;
}
ли мои предположения правильные ?
Возможный дубликат [Doub le.Epsilon для равенства, больше, меньше, меньше или равно, больше или равно] (http://stackoverflow.com/questions/2411392/double-epsilon-for-equality-greater-than -less -than-less-than-or-equal-to-gre) –