Сравнение значений с плавающей точкой

Я в настоящее время работаю с (собственной) платформой, которая предоставляет себя хорошо UI-as-state-machine парадигме, и она может определенно уменьшить (но не устранить), проблемы со сложными и непредвиденными взаимодействиями между элементами UI.

основное преимущество - то, что это позволяет Вам думать в более высоком уровне абстракции при более высокой гранулярности. Вместо того, чтобы думать, "Если кнопка A нажимается тогда, заблокировано поле комбинированного списка B, текстовое поле C очищено и и Кнопка D разблокирована", Вы думаете, что "Нажимающая кнопка A помещает приложение в ПРОВЕРЕННОЕ состояние" - и ввод того состояния означает, что определенные вещи происходят.

я не думаю, что это полезно (или даже возможно) смоделировать весь UI как единственный конечный автомат, все же. Вместо этого обычно существует много конечных автоматов меньшего размера, что каждый обрабатывает одну часть UI (состоящий из нескольких средств управления, которые взаимодействуют и принадлежат вместе концептуально), и один (возможно, больше чем один) "глобальный" конечный автомат, который обрабатывает более основные проблемы.

6
задан Konamiman 11 May 2015 в 08:32
поделиться

2 ответа

Следующие методы расширения могут быть полезны для реализации предложения Кевина:

public static bool IsEqualTo(this double a, double b, double margin)
{
    return Math.Abs(a - b) < margin;
}

public static bool IsEqualTo(this double a, double b)
{
    return Math.Abs(a - b) < double.Epsilon;
}

Теперь вы можете просто сделать:

if(x1.IsEqualTo(x2)) ...
if(x1.IsEqualTo(x2, 0.01)) ...

Просто измените IsEqualTo на более подходящее имя или при необходимости измените поле по умолчанию на значение лучше, чем double.Epsilon .

8
ответ дан 8 December 2019 в 18:38
поделиться

Обычно числа с плавающей запятой следует сравнивать, используя конструкцию типа

if( abs((x1 - x2) < 0.001) )

Причина указанного вами предупреждения заключается в том, что у вас может быть два метода вычисления чего-либо, и они могут быть равны, если у вас не было ошибка округления, но ошибка округления немного отличается.

3
ответ дан 8 December 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: