zHz00 Untitled

суббота, 14 мая 2022
02:59 Крайне мала
Все знают, что числа float нельзя сравнивать на равенство друг с другом. Потому что в результате расчётов одно число будет 1.999, а другое 2.001. И они будут не равны. Обычно используют формулу типа:

то есть сравнивают разность с определённым небольшим числом. Так делал и я.

Итак, надо было привести в движение деталь очередным шаговым двигателем. Переместиться на заданное расстояние fDistance. В связи с некоторыми особенностями алгоритмов размер перемещения периодически бывал равен нулю. В этих случаях никуда перемещаться было не надо, иначе возникали неожиданные последствия. То есть, если перемещение равно нулю, то команду надо было игнорировать.

Ну, я написал:



EPS я задал 0.0001, поскольку характерные значения минимальных настоящих перемещений были в районе 1.0 .

Во всех этих сравнениях есть один тонкий момент. На точное равенство с нулём на самом деле сравнивать МОЖНО, хотя и не нужно. Потому что сам ноль имеет в форматах float/double точное, а не приближённое представление. Если величина изначально задаётся нулём при инициализации, или через настроечный файл, то сравнения будут работать корректно. А вот если ноль является результатом вычислений, тут уже возникают проблемы.

Итак, ноль у меня являлся результатом вычислений, при которых сырые величины умножались на коэффициент преобразования, чтобы получились величины физические.

ОКАЗАЛОСЬ,

что нулевое перемещение после расчётов периодически оказывается равно 0.001, а это больше моего EPS. В результате команда Move вызывалась.

Пришлось поставить EPS==0.1.

@темы: Программирование, Борьба с техникой

URL

21.05.2022 в 20:50

21.05.2022 в 20:50
Все знают, что числа float нельзя сравнивать на равенство друг с другом.

«Все с детства знают, что то-то и то-то невозможно. Но всегда находится невежда, который этого не знает. Он-то и делает открытие» ­— Альберт Эйнштейн

-- Minoru
URL

21.05.2022 в 20:52

21.05.2022 в 20:52
Minoru, да, надо было написать "с детства"))
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail