Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 27 из 27

Тема: Как округлить значение в STRING?

  1. #21
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от Smith2007 Посмотреть сообщение
    Я посмотрел. Согласен, но ее ресурсоемкость не соизмерима. При всем, что нет таких требований. Во всем разумная необходимость д.б.
    могу сказать что использование while может привести к перегрузке контроллера, так что совсем не показательно Вам разговоры разговаривать о какой то там ресурсоемкости

  2. #22
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,256

    По умолчанию

    Потребовалось округление до 1 знака после запятой.
    Это не "округление" в математическом смысле, а просто отбрасываем все,
    Вы бы тоже определились

  3. #23
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от Smith2007 Посмотреть сообщение
    Потребовалось округление до 1 знака после запятой. Алгоритм должен быть наименее ресурсоемкий.
    На Ваш суд:

    Код:
    FUNCTION REAL_TO_STRINGF : STRING[20]
    VAR_INPUT
    	Real_X:	REAL;
    END_VAR
    VAR
    	pt_in:  	POINTER TO BYTE;
    	pt_out:	POINTER TO BYTE;
    	instr:		STRING[20];
    	strlen, i:	INT;
    END_VAR
    
    IF ABS( Real_X ) < 0.1 THEN
    	REAL_TO_STRINGF := '0.0';
    	RETURN;
    END_IF;
    instr := REAL_TO_STRING( Real_X );
    strlen := LEN(instr);
    pt_in := ADR(instr);
    pt_out := ADR( REAL_TO_STRINGF );
    i:= 1;
    WHILE i <= strlen DO
    	IF pt_in^ = 46 THEN
    		pt_out^ := pt_in^;
    		IF i = strlen THEN
    			pt_out := pt_out + 1;
    			pt_out^ := 48;
    		ELSE
    			pt_in := pt_in + 1;
    			pt_out := pt_out + 1;
    			pt_out^ := pt_in^;
    		END_IF;
    		EXIT;
    	END_IF;
    	pt_out^ := pt_in^;
    	pt_in := pt_in + 1;
    	pt_out := pt_out + 1;
    	i := i +1;
    END_WHILE
    pt_out := pt_out + 1;
    pt_out^ := 0;
    А как такой вариант, вместо Вашего кода
    REAL_TO_STRINGF := REAL_TO_STRING(INT_TO_REAL(TRUNC(Real_X * 10.0))/10.0);

  4. #24
    Пользователь
    Регистрация
    09.08.2013
    Адрес
    Башкортостан
    Сообщений
    234

    По умолчанию

    Тоже вариант. Просто еще со студенческой скамьи помню, что операции умножения и деления (особенно чисел с плавающей точкой) довольно трудоемки для процессоров. Позже еще появились математические сопроцессоры, которые и выполняли данные операции. А While это всего лишь целочисленный счетчик.
    (Ну это я так думаю, хотя могу и ошибаться. Давно с IT и программированием не сталкивался).

  5. #25
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    не трудоемки а занимают больше процессорного времени, но если реал в четыре раза превышает по времени простой счет, то сравните сколько Вы делаете инструкций и сколько в моей строчке даже помноженной на четыре

  6. #26
    Пользователь
    Регистрация
    09.08.2013
    Адрес
    Башкортостан
    Сообщений
    234

    По умолчанию

    Практически одинаково по времени получилось

  7. #27
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    если это сравнение с моим кодом
    ну и раз нет разницы зачем "платить больше", чем меньше объем кода тем меньше ошибок
    а так то Вы сделайте штук сто таких вычислений, по одному значению ни кто ни когда не судит

Страница 3 из 3 ПерваяПервая 123

Похожие темы

  1. Длинный STRING
    от Nazar в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 08.03.2011, 13:04
  2. Ответов: 1
    Последнее сообщение: 28.01.2011, 16:42
  3. Преобразование из string
    от Dima_31 в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 07.05.2010, 20:35
  4. String переменные в архиваторе
    от Антон в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 25.12.2007, 10:53

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •