Округление при вычислениях

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
Ответить
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Округление при вычислениях

Сообщение Kosist »

Уважаемые знатоки, обращаюсь к вас со следующим вопросом.
Не знал как правильно назвать пост, но суть такова.
Substraction.png
Прикрепляю тестовую :vi: и скрин кода. Почему-то при вычислениях, если step равняется 0.1, 0.2, 0.3 или 0.4, в конце получается не ноль, а число в E-16 или подобной степени.
Например, шаг = 0,3 - финальный результат -1.11022E-16.
Если же шаг 0,5 и выше - то все нормально, в конце получаю "чистый" ноль.
Но в тоже время, если шаг 0,25 - то все нормально.
Ладно бы были здесь операции деления/умножения, еще бы было более понятно. Но почему в :labview: возникают такие проблемы при сложении/вычитании?
И как можно "заставить" все-таки на индикаторе изображать просто ноль, а не отрицательное число из запятой и 15-ю нулями?
Суть в том, что я делаю модуль для симуляции движения мотора. И для пользователя будет странно видеть -1.11022E-16 вместо ноля (например, когда мотор движется на домашнюю позицию).
Можно городить код из сравнением числа с нолем с точностью меньшей чем сам шаг, но хотелось бы более элегантное решение...
Заранее спасибо за советы/объяснения :thank:
Вложения
Test Dbl.vi
(5.48 КБ) 64 скачивания
Мы делили апельсин - много наших полегло...
Sergey Puzanov
assistant
assistant
Сообщения: 113
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Округление при вычислениях

Сообщение Sergey Puzanov »

Не особо знаток, но дело явно в представлении дробных чисел компьютером, с округлениями вообще всегда очень сложно было в программировании, особенно в банковских системах, где копеечка в копеечку должна совпадать. Вот как выглядит представление чисел:
изображение_2021-11-29_091321.png
Решение для индикатора - выбрать формат отображения floating point, будет 0.0, не чистый 0, но тоже прилично выглядит.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Округление при вычислениях

Сообщение Kosist »

Я понимаю, что дело в представлении - но чтобы прямо так...
Дефолтный Floating point пробовал, результат тот же. Но если поменять Precision Type на Digits of precision - то тогда все норм...
Мы делили апельсин - много наших полегло...
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Округление при вычислениях

Сообщение dadreamer »

Kosist писал(а): 29 ноя 2021, 01:07Но почему в :labview: возникают такие проблемы при сложении/вычитании?
Эти "грабли" мы уже проходили: viewtopic.php?p=66525#p66525 Числа с плавающей точкой так хранятся в бинарном виде согласно стандарту IEEE 754. Задаёте step = 0,1, но там никогда не будет точно 0,1, а будет 0,100000000000000006. У констант на диаграмме тоже можно изменить представление, попробуйте увеличить число знаков после запятой и увидите хвост. А вот у 0,5 хвост состоит полностью из нулей.

На контролах и индикаторах я ставлю Floating Point и Digits of Precision на 2 или 3, изредка на 4, этого вполне хватает. Никогда ещё не требовалось более точно позиционировать двигатель.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Округление при вычислениях

Сообщение Kosist »

Спасибо! Значит, буду более внимателен к таким мелочам.
Нашел тоже такой сайт - https://www.h-schmidt.net/FloatConverter/IEEE754.html, где все наглядно показано...
Мы делили апельсин - много наших полегло...
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Общие»