Не могу понять, что происходит с расчётами. Прикладываю скрин эмуляции, где разные значения обратных вычислений.
Вложение 26233
Не понимаю, то лыжи не едут, то ли я идиот. Перепробовал уже кучу вариантов, с переприсвоениями промежуточными и т.п. в итоге результат неправильный. Вплоть до формулы c:=a-b, где a и b REAL переменные. В режиме эмуляции присваиваю им соответственно 90916050086-90916000000, получаю с=50112 вместо 50086. Это как так может быть?
Ну Вы даете!
Если диапазон представления чисел для REAL от -3.4028E+38 до 3.4028E+38, то это вовсе не означает, что можно одиннадцати разрядные числа использовать!
Ведь для мантиссы отводится всего 23 бита из 32. В стандарте IEEE 754 несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения NaN (Not a Number, «не число») и +/-INF (Infinity, бесконечность), получающихся в результате операций деления на ноль или при превышении числового диапазона. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы.
В любом случае числа REAL то приблизительные и точность ограничена разрядной сеткой процессора.
Для обычного REAL число десятичных знаков д.б. не более семи, а Вы пытаетесь скормить кодесису одиннадцать. Не знаю, как компилятор округляет, например, 90916050086 может так 9.0916052992E10?
https://ru.wikipedia.org/wiki/%D0%A7...82%D0%BE%D0%B9
Вложение 26236
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
TIME()-old>=T#10s - условие: если прошло не меньше 10 секунд, то выражение будет TRUE иначе будет FALSE.
BOOL_TO_INT преобразует тип BOOL в тип INT. То есть если значение выло true, то в результате будет 1, а если false, то будет 0.
Аналогично можно было записать так:
...
1: IF TIME()-old>=T#10s THEN
state:=2;
END_IF
...
Petera, спасибо за ликбез. В общем суть понял. Что осталось непонятным, это то,что на скриншоте вычисления с 1 по 9-ю строку и с 12 по 14-ю выполняются правильно. Вообще, я пытался обработать ваше гениальное решение по преобразованию времени в одну переменную для ПР200. И если значение даты удалось обработать, то на времени получается то что на скрине ((
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
+100500%
Не надо заниматься ерундой, в кодесис переменные DATA_AND_TIME или DT уже упакованы в 32-х битную величину, которая не что иное как время UNIX или другое название - POSIX. Это число секунд с 0 часов 1 января 1970г. Дискретность в 1 секунду считается достаточной для большинства практических задач.
Осталось только передать в ПР значение DWORD в двух соседних регистрах и "склеит" их в ПР в одну переменную.
Для извлечения отдельных значений года, дня, месяца и т.д. нужно будет делать макросы. Вроде я где-то показывал, как в кодесисе их извлекать.
Для расширения кругозора почитайте статью И.Петрова Программируем временные сложности
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg