Неправильный расчет математики

В этот форум переносятся темы из форума "Новые" которые при рассмотрении модератором или автором признанны либо не верными, либо ошибочными.
Ответить
Аватара пользователя
AlexRyzh
Сержант
Сообщения: 107
Зарегистрирован: 22.12.2015{, 11:06}
Репутация: 1
Откуда: Мелитополь
Контактная информация:

Неправильный расчет математики

#1

Сообщение AlexRyzh » 29.02.2016{, 22:20}

Долго провозился, пока понял что математика не правильно считает.  Работал с датчиком влажности почвы. Все работает как нужно. Решил организовать вывод в процентах. Вот тут и начались проблемы. При малых входных значениях вроде правильно показывает, при больших ересь какая-то. Но я то не сразу это понял. Просто проверял разные варианты влажности...
Оказалось математические блоки врут. 
Для вычисления процента влажности я использовал такую формулу:
Данные: 1023  это 0% влажность
                 0 - это 100% влажность
             Например 85 - это ?% влажность
Считаем: 100-(85*100/1023)=91%
             А если сухо 1023 или скажем 1000
             100-(1000*100/1023)=2%
А у нас что получается, если вычислять математикой?


Правильно, ересь какая-то. А дело в том, что объявленные константы имеют свой соответствующий тип. Например константе 100 я присвоил тип byte, и это справедливо, зачем резервировать памяти больше чем этого требует константа или переменная??? Соответственно и другие константы вписываются в свой тип. И в результате не работает с большими значениями. А все потому, что мы не можем указать тип выходных данных. Т.е должны быть возможность выбора типа для результата с блока.
Теперь, чтоб блок работал, мне пришлось всем участвующим константам и переменным присвоить тип Long Integer. Вот после этого вычисления стали работать правильно
Вложения
5863086.jpg
0535246.jpg

Аватара пользователя
AlexRyzh
Сержант
Сообщения: 107
Зарегистрирован: 22.12.2015{, 11:06}
Репутация: 1
Откуда: Мелитополь
Контактная информация:

Неправильный расчет математики

#2

Сообщение AlexRyzh » 29.02.2016{, 22:53}

Посмотрим на скетч, как это все неправильно происходит. 
Множитель выбран типа byte, а в скетче этот тип присваивается результату!!!
Ну это же не правильно! 
Конечно, зная этот алгоритм, можно обмануть блок и назначить множителю Long Integer, хотя он легко вписывается в Byte


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


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

Вложения
7316891.jpg
9532632.jpg
5744645.jpg

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 787
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Неправильный расчет математики

#3

Сообщение support » 01.03.2016{, 21:19}

Вы немного не поняли принципа работы компилятора из С в машинный код контроллера. Когда Вы пишете на С математическое выражение, он сам определяет какую память выделять для результата, ориентируясь на типы входных операндов.   Например если Вы пишете 1023 (Int) * 100 (Int) то и результат он положит в два байта (Int). У Вас в результате этой операции получится 102300 что никак не помещается в эту память Он же не знает какие там величины. Но при наличии в качестве хотя - бы одного оператора типа Long (например L1023*100) результат положится в четыре байта и значение расчета поместится.  Обратите внимание что тип выхода блока при таком задании констант изменится и покажет что результат будет Long.  Это особенность не FLProg а компилятора C, и я ничего с этим поделать не могу. Сказать компилятору в какой тип положить результаты вычислений другим способом не представляется возможным, поэтому я не могу сделать выбор типа выхода блока, а могу только показать каким он будет с точки зрения компилятора С, что и реализовано с самого начала.
Автор программы FLProg.

Аватара пользователя
AlexRyzh
Сержант
Сообщения: 107
Зарегистрирован: 22.12.2015{, 11:06}
Репутация: 1
Откуда: Мелитополь
Контактная информация:

Неправильный расчет математики

#4

Сообщение AlexRyzh » 02.03.2016{, 09:20}

Спасибо. Теперь буду знать и учитывать это. Все ж не зря вопроса коснулся, все ж какой-то опыт  Изображение

Ответить

Вернуться в «Не принятые»