A2 & Oberon GOOGLE trans to English      Помощь      Поиск      Пользователи  Файловый архив


 Страниц (2): [1] 2 »   

> Описание: Округление
sage Администратор
Отправлено: 02 Января, 2009 - 12:34:30
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




Нашёл в комментариях к модулю QtCore0ToolsQPoint.Mod у Юрия:
Цитата:
\todo Надо сделать округление до целого.

Сам недавно столкнулся с данным вопросом.
В Обероне есть только функция ENTIER, полностью соответствующая Си-шной floor (округление до ближайшего целого вниз).
Как-же правильно сделать округление (round) и округление до ближайшего целого вверх (ceil)?
А вот как: Подмигивание
PROCEDURE round(x: REAL): LONGINT;
BEGIN
RETURN ENTIER(x + 0.5)
END round;
PROCEDURE ceil(x: REAL): LONGINT;
BEGIN
RETURN -ENTIER(-x)
END ceil;
 
 Top
lit-uriy Супермодератор
Отправлено: 02 Января, 2009 - 14:30:54
Post Id


Advanced Member


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2008  
Откуда: Тюмень / Новосибирск
Репутация: 0




sage, спасибо большое, я как раз собирался спросить на форуме, да руки не дошли.
Улыбка
(Добавление)
а библиотечных штучек нет для этих целей? всмысле разных. И как вообще приведение типов осуществляется и возможные комбинации?
 
 Top
sage Администратор
Отправлено: 02 Января, 2009 - 20:14:13
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




Вобщем-то, очевидна универсальность функции ENTIER, понятно почему Вирт не включил аналогов round и ceil в компилятор Подмигивание
Библиотека, дело хорошее (хорошо-бы иметь эти функции в модуле Math, к примеру), но иногда можно поступиться структурностью в пользу скорости Улыбка
На счёт приведения типов, иногда оно не может быть выполнено автоматически, например если пытаться переменной типа INTEGER присвоить результат операции над переменными типа LONGINT. В Этом случае необходимо использовать SHORT() для явного приведения типа.
Например, округление до INTEGER, запишется так:
PROCEDURE round(x: REAL): INTEGER;
BEGIN
RETURN SHORT(ENTIER(x + 0.5))
END round;
 
 Top
lit-uriy Супермодератор
Отправлено: 02 Января, 2009 - 21:23:32
Post Id


Advanced Member


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2008  
Откуда: Тюмень / Новосибирск
Репутация: 0




SHORT() - часть компилятора/языка или библиотечная функция?
 
 Top
BohdanT Администратор
Отправлено: 02 Января, 2009 - 22:11:08
Post Id



Super Member


Покинул форум
Сообщений всего: 606
Дата рег-ции: Июль 2008  
Откуда: Киев, Украина
Репутация: 2




lit-uriy пишет:
И как вообще приведение типов осуществляется и возможные комбинации


Для "принудительного" приведения типов используется SYSTEM.VAL, не знаю где взять описание, могу привести пару примеров:


PROCEDURE ColorToIndex*(col: LONGINT): LONGINT;
BEGIN
(* default implementation is not very useful and should be overridden. *)
RETURN SYSTEM.VAL(LONGINT,
SYSTEM.VAL(SET, ASH(col, 7-23)) * {5..7} +
SYSTEM.VAL(SET, ASH(col, 4-15)) * {2..4} +
SYSTEM.VAL(SET, ASH(col, 1-7)) * {0..1})
END ColorToIndex;

(** Map an 8-bit CLUT index to a color value. Only used if format = index8. *)
PROCEDURE IndexToColor*(index: LONGINT): LONGINT;
BEGIN
(* default implementation is not very useful and should be overridden. *)
RETURN
ASH(SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, index) * {5..7}), 23-7) +
ASH(SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, index) * {2..4}), 15-4) +
ASH(SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, index) * {0..1}), 7-1)
END IndexToColor;



еще один вариант жесткого приведения я привел тут
http://a2os.org.ua/forums/topic....84690#1224184690
 
 Top
sage Администратор
Отправлено: 02 Января, 2009 - 22:35:23
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




SHORT() - часть компилятора/языка, так же как и ENTIER()
Точнее, они называются предопределёнными процедурами 10.2. Predefined procedures
 
 Top
BohdanT Администратор
Отправлено: 02 Января, 2009 - 22:59:57
Post Id



Super Member


Покинул форум
Сообщений всего: 606
Дата рег-ции: Июль 2008  
Откуда: Киев, Украина
Репутация: 2




http://maxandreev.narod.ru/obero...nReport_RUS.html
4.2 HUGEINT

В язык был добавлен 64 битный знаковый целый тип HUGEINT. Он вписывается в иерархию числовых типов следующим образом:

LONGREAL ⊇ REAL ⊇ HUGEINT ⊇ LONGINT ⊇ INTEGER ⊇ SHORTINT

Имя Тип аргумента Тип результата Функция

SHORT(x) HUGEINT LONGINT идентичность (возможно усечение)

LONG(x) LONGINT HUGEINT идентичность

ENTIERH(x) вещественный HUGEINT наибольшее целое, не превышающее x
 
 Top
BohdanT Администратор
Отправлено: 22 Ноября, 2010 - 17:53:01
Post Id



Super Member


Покинул форум
Сообщений всего: 606
Дата рег-ции: Июль 2008  
Откуда: Киев, Украина
Репутация: 2




Немного подниму тему Ха-ха

Вот вырвал из delphi, а то реально нехватает иногда:

PROCEDURE -TRUNC(r: REAL): LONGINT;
CODE {SYSTEM.i386,SYSTEM.FPU}
FLD DWORD [ESP] ; Load r into ST(0)
SUB ESP,0CH
FSTCW [ESP]
FSTCW [ESP+2]
OR WORD[ESP+2],0F00H
FLDCW [ESP+2]
FISTP QWORD[ESP+4]
FLDCW [ESP]
POP ECX
POP EAX
POP EDX
END TRUNC;


А это взято Здесь
Работает значительно быстрее, чем ENTIER(r+0.5)
 PROCEDURE -ROUND(r: REAL): LONGINT;
CODE {SYSTEM.i386,SYSTEM.FPU}
FLD DWORD [ESP] ; Load r into ST(0)
FISTP DWORD [ESP] ; Store ST(0) in [ESP] and pop ST(0)
POP EAX ; EAX = [ESP]
END ROUND;
 
 Top
sage Администратор
Отправлено: 23 Ноября, 2010 - 10:11:43
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




BohdanT пишет:

 PROCEDURE -ROUND(r: REAL): LONGINT;
CODE {SYSTEM.i386,SYSTEM.FPU}
FLD DWORD [ESP] ; Load r into ST(0)
FISTP DWORD [ESP] ; Store ST(0) in [ESP] and pop ST(0)
POP EAX ; EAX = [ESP]
END ROUND;
Так этот код именно ROUND реализует? А как будет выглядеть TRUNC? Делфовый вариант самый оптимальный?
Я тут подумал, что было-бы неплохо всё-таки сделать библиотечку в которой взяв за базис TRUNC вывести все необходимые функции (round, ceil, floor и frac). http://valexey.blogspot.com/2010...floor-trunc.html
Модуль можно обозвать I386.MathUtils.Mod, например.
Написать бенчмарк для этого всего дела, и использовать Подмигивание
 
 Top
BohdanT Администратор
Отправлено: 23 Ноября, 2010 - 10:15:04
Post Id



Super Member


Покинул форум
Сообщений всего: 606
Дата рег-ции: Июль 2008  
Откуда: Киев, Украина
Репутация: 2




Цитата:
Я тут подумал, что было-бы неплохо всё-таки сделать библиотечку в которой взяв за базис TRUNC

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

Кстати TRUNC будет работать немного быстрее, чем в делфи, т.к. там идет вызов функции, а здесь инлайн однако Улыбка
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0)
« Общеe »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Locations of visitors to this page
[Valid RSS]

RSS

Valid CSS!


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0122]     [ Gzipped ]