FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Пятница, 09.12.2016, 14:33
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Сергей, support 
Форум » Баг - Трекер » Не принятые » Неправильный расчет математики
Неправильный расчет математики
AlexRyzh
Дата: Понедельник, 29.02.2016, 22:20 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 107
Награды: 1
Репутация: 0
Статус: Offline
Долго провозился, пока понял что математика не правильно считает.  Работал с датчиком влажности почвы. Все работает как нужно. Решил организовать вывод в процентах. Вот тут и начались проблемы. При малых входных значениях вроде правильно показывает, при больших ересь какая-то. Но я то не сразу это понял. Просто проверял разные варианты влажности...
Оказалось математические блоки врут. 
Для вычисления процента влажности я использовал такую формулу:
Данные: 1023  это 0% влажность
                 0 - это 100% влажность
             Например 85 - это ?% влажность
Считаем: 100-(85*100/1023)=91%
             А если сухо 1023 или скажем 1000
             100-(1000*100/1023)=2%
А у нас что получается, если вычислять математикой?


Правильно, ересь какая-то. А дело в том, что объявленные константы имеют свой соответствующий тип. Например константе 100 я присвоил тип byte, и это справедливо, зачем резервировать памяти больше чем этого требует константа или переменная??? Соответственно и другие константы вписываются в свой тип. И в результате не работает с большими значениями. А все потому, что мы не можем указать тип выходных данных. Т.е должны быть возможность выбора типа для результата с блока.
Теперь, чтоб блок работал, мне пришлось всем участвующим константам и переменным присвоить тип Long Integer. Вот после этого вычисления стали работать правильно
Прикрепления: 0535246.jpg(62Kb) · 5863086.jpg(68Kb)
 
AlexRyzh Дата: Понедельник, 29.02.2016, 22:53 | Сообщение # 2
Лейтенант
Группа: Проверенные
Сообщений: 107
Награды: 1
Репутация: 0
Статус: Offline
Посмотрим на скетч, как это все неправильно происходит. 
Множитель выбран типа byte, а в скетче этот тип присваивается результату!!!
Ну это же не правильно! 
Конечно, зная этот алгоритм, можно обмануть блок и назначить множителю Long Integer, хотя он легко вписывается в Byte


И зачем константе назначать тип, если в скетче формируется строка не через переменную, а чистым числом? Ведь если в строке подставляется число, то компилятору плевать, какой тип этого числа. Число оно и есть число. Тип назначается для переменной, а переменная в нашем случае как раз результат вычислений. А вот как раз результату мы и не имеем возможности присвоить тип!
Изменил тип только переменной на Лонг, считает не правильно
 


Изменил только в блоке умножения константы на Лонг, работает правильно!
По моему так не должно быть.

Прикрепления: 5744645.jpg(79Kb) · 9532632.jpg(98Kb) · 7316891.jpg(88Kb)
 
support Дата: Вторник, 01.03.2016, 21:19 | Сообщение # 3
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 31
Репутация: 21
Статус: Offline
Вы немного не поняли принципа работы компилятора из С в машинный код контроллера. Когда Вы пишете на С математическое выражение, он сам определяет какую память выделять для результата, ориентируясь на типы входных операндов.   Например если Вы пишете 1023 (Int) * 100 (Int) то и результат он положит в два байта (Int). У Вас в результате этой операции получится 102300 что никак не помещается в эту память Он же не знает какие там величины. Но при наличии в качестве хотя - бы одного оператора типа Long (например L1023*100) результат положится в четыре байта и значение расчета поместится.  Обратите внимание что тип выхода блока при таком задании констант изменится и покажет что результат будет Long.  Это особенность не FLProg а компилятора C, и я ничего с этим поделать не могу. Сказать компилятору в какой тип положить результаты вычислений другим способом не представляется возможным, поэтому я не могу сделать выбор типа выхода блока, а могу только показать каким он будет с точки зрения компилятора С, что и реализовано с самого начала.

Разработчик программы FLProg
 
AlexRyzh Дата: Среда, 02.03.2016, 09:20 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 107
Награды: 1
Репутация: 0
Статус: Offline
Спасибо. Теперь буду знать и учитывать это. Все ж не зря вопроса коснулся, все ж какой-то опыт  smile
 
Форум » Баг - Трекер » Не принятые » Неправильный расчет математики
Страница 1 из 11
Поиск:

FLProg © 2016
Яндекс.Метрика