PDA

Просмотр полной версии : Функция округления вещественных чмсел



GoodLuck
19.05.2014, 14:54
Подскажите, пожалуйста, в Codesys v3 имеется функция округления вещественного числа?

Мурат Ахриев
19.05.2014, 17:11
Округление реализовано в библиотеке OSCAT, функция ROUND.

lara197a
19.05.2014, 20:11
Умножте на сколько нужно и используйте "ABS"

liboyl
16.07.2014, 20:13
Подскажите, пожалуйста, где находится библиотека OSCAT, функция ROUND. "ABS" не работает....

Александр Приходько
16.07.2014, 23:22
http://www.owen.ru/forum/showthread.php?t=15530&p=115706&viewfull=1#post115706

liboyl
17.07.2014, 12:12
нужна была функция округления - TRUNC или ROUND бз.р. , а заинтересовала библиотека....

vnkorol
29.11.2015, 09:41
Апну тему. Есть REAL. Надо округлить его до сотых. Причем числа там могут быть от -1000 до +1000, т.е. количество цифр в целой части от одного до трех. Можно, конечно, проверять количество цифр и рубить ROUND, но это как-то неправильно...

melky
29.11.2015, 10:30
Держите эспортированный Round

Правда не помню, там еще и структура кажется нужна.

vnkorol
29.11.2015, 12:50
Ну Вы хотя бы попытались сделать REAL_TO_INT для своей переменной? Когда поймете принцип, неужли трудно в одном месте умножить в другом разделить?

Не трудно совсем. Но это же не округление, а отсечение хвоста получится?

vnkorol
30.11.2015, 08:04
Тупанул. Считал, что real_to_int обрезает, а не округляет почему-то. А так - да, на 100 умножил, преобразовал и разделил на 100. Максимально корректно.

Спасибо!

Bananov
30.11.2015, 12:36
И я благодарю. Вопросы были. Прочел и понял свое.

Дмитрий Артюховский
30.11.2015, 23:25
round_real = INT_TO_REAL( TRUNC( 100 * ( X_real + 0.005 ) ) ) / 100;

sssssaaaaabbbbb
08.07.2019, 12:25
Здравствуйте форумчане. Так в итоге мне непонятно, как округлить допустим
x:=-34,37563245;
y:=x;
как сделать так, чтоб y = -34,4

sssssaaaaabbbbb
08.07.2019, 12:27
Здравствуйте форумчане. Так в итоге мне непонятно, как округлить допустим
x:=-34,37563245;
y:=x;
как сделать так, чтоб y = -34,4

Cbug
12.02.2020, 20:56
FUNCTION REAL_Round_WORD : WORD
VAR_INPUT
f:REAL;
n:WORD;
END_VAR
VAR
f1:REAL;
i:WORD;
w:WORD;
END_VAR

f1:=f;
FOR i:=0 TO n DO
f1:=f1*10;
END_FOR;
w:=REAL_TO_WORD(f1);
REAL_Round_WORD:=w/10;
IF (w MOD 10)>=5 THEN
REAL_Round_WORD:=REAL_Round_WORD+1;
END_IF;

---------------------------------------------------------------
REAL_Round_WORD(14.7,0) = 15
REAL_Round_WORD(14.2,0) = 14
REAL_Round_WORD(14.86,1) = 149
REAL_Round_WORD(14.82,1) = 148

Cbug
13.02.2020, 09:18
Да серьезно. Если Вы не знаете что в тип WORD помещается максимум 5 цифр, то можно в N и 6 и 7 подставлять. Кому надо может выходной тип на DWORD заменить, а кто хочет мега универсальную функцию с защитой от дурака снабдить ее проверками.

Cbug
13.02.2020, 09:25
w:dword;
f:real;

w:=REAL_TO_DWORD(f*10);
w:=w/10+BOOL_TO_DWORD((w MOD 10)>4));

Cbug
13.02.2020, 10:33
Ничего плохого я в циклах не вижу, чтобы лишний раз их не использовать. Краткость некомпилированного кода не означает быстроту его работы. Те кто программировал на ассемблере знают, например, что логический сдвиг вправо на 1 работает на порядок быстрее, чем деление на 2. И таких примеров масса. Так, например, цикл с простыми операциями может работать быстрее, чем одна сложная операция. На слабых процессорах скорость выполнения кода лично для меня имеет более высокую ценность, чем его длина.

Ваше дополнение имеет большую пользу для читателей форума, аккумулируя знания по конкретной теме.

На данном форуме не хватает спойлера с кодом "народной" функции, отличающейся универсальносью и производительностью.

offtop:
А лично Вас, capzap, я бы хотел попросить немного изменить стиль повествования с высокомерного на нейтральный, дабы не превращать источник знаний в срач. И я говорю не только об этой теме, а обо всех Ваших многочисленных публикациях. Спасибо, что Вы уделяете много времени для развития базы знаний АСУшников.

Sergey666
13.02.2020, 11:05
FUNCTION REAL_Round_WORD : WORD
VAR_INPUT
f:REAL;
n:WORD;
END_VAR
VAR
f1:REAL;
i:WORD;
w:WORD;
END_VAR

f1:=f;
FOR i:=0 TO n DO
f1:=f1*10;
END_FOR;
w:=REAL_TO_WORD(f1);
REAL_Round_WORD:=w/10;
IF (w MOD 10)>=5 THEN
REAL_Round_WORD:=REAL_Round_WORD+1;
END_IF;

---------------------------------------------------------------
REAL_Round_WORD(14.7,0) = 15
REAL_Round_WORD(14.2,0) = 14
REAL_Round_WORD(14.86,1) = 149
REAL_Round_WORD(14.82,1) = 148

Феерический идиотизм!
Real_to_word...ха-ха-ха.
Надо бы теорию подучить, начиная с размерности и диапазона чисел...
И что покажет word-dword при конвертации отрицательных чисел?

Cbug
13.02.2020, 13:40
Да... ребята. Прямо сборище интеллектуалов!

Надеюсь, что тот неопытный новичок который придет сюда за знаниями сможет найти здесь что-то из большой кучи безполезных постов.

Функция реально рабочая - преобразует значения датчиков давления (со всегда положительными значениями) в регистр modbus, для последующего отображения на hmi со смещением десятичной точки.

Заменить типы переменных на какие кому необходимо не составит труда.

Cbug
13.02.2020, 14:30
Вот это деловой подход!
С такими талантами думаю Вам под силу написать "народную" функцию универсального округления!
С удовольствием добавлю ее в свою библиотеку.

Sergey666
14.02.2020, 13:08
Да... ребята. Прямо сборище интеллектуалов!

Надеюсь, что тот неопытный новичок который придет сюда за знаниями сможет найти здесь что-то из большой кучи безполезных постов.

Функция реально рабочая - преобразует значения датчиков давления (со всегда положительными значениями) в регистр modbus, для последующего отображения на hmi со смещением десятичной точки.

Заменить типы переменных на какие кому необходимо не составит труда.

Датчики давления со всегда положительными значениями... нда теоретик , а что будет показывать функция ваша, если датчик чуть-чуть свакуумировался (такое бывает сплошь и рядом), или дрожание значения 3.8ма...4.2ма? И ведь пишут теоретики ересь типа real_to_word, а в результате та-дам ни с того ни с сего защиты отработали и...ракета...самолет утонули в мировом океане, хим завод выбросил в окружающую среду какую-то вредную хрень и тд и тп.
А неопытному новичку на форумах нефиг знаний искать!!! Только ответы на конкретные вопросы! А знания надо искать в учебниках, руководствах пользователя и пр. документах, благо интернет сейчас позволяет не рыскать по техническим библиотекам!