OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 14:03

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 135 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
Автор Сообщение
СообщениеДобавлено: Среда, 22 Июль, 2009 13:42 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Это вам нужно, что ли?
Код:
procedure RealToBytes (const val: Double; out arr: array of Byte);
begin
  Move (val, arr, SizeOf (val));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  d: Double;
  a: array [0..SizeOf (Double) - 1] of Byte;
begin
  d := 123.456789;
  RealToBytes (d, a);
end;
sa_t_an писал(а):
Ну как сказать? Для любого компилера 33.12345678 не совсем двоичное - для начала его надо перевести в IEEE-754 float point формат (что бы сохранять допустим в файл)
А при вызове наоборот конвертнуть назад...
Ерунду какую-то напридумывали себе. Прошу же разобраться в проблеме, подробно описать. Нет времени сесть подумать?
sa_t_an писал(а):
Единственное что я не понимаю, так что я тут ваще делаю то?
Тут вы себе льстите. : )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 14:16 

Зарегистрирован: Суббота, 04 Июль, 2009 19:22
Сообщения: 45
Код:
Тут вы себе льстите


Ну тут скорее вам, если б себе я бы уже давно свалил... Мне просто интересен уровень ваш (вернее отсутствие)

Итак в сотый раз пишу...
Я делаю компилятор(вернее сделал уж почти) на делфи(пишу на русском) совместимый с компилятором оберон...
Совместимость включает в себя создание символьных файлов ПОЛНОСТЬЮ совместимых с символьными файлами оберон компилятора POW! Так вот функция двумя постами выше(моя) дает точное представление числа в формате IEEE как в оберон компиляторе.

Теперь вопрос к мозговому центру профессорского уровня...
Вы вообще представляете ЧТО ДЕЛАЕТ ВАША функция, или вам просто интересно писать лишь бы показать свой уровень?

Для танкистов попробуйте сделать аналог var x: system.byte на дельфи и сравните результат в обероне и в вашей функции, после этого (и только после этого) прошу отписываться и показывать величину своей образованности!!!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 14:45 

Зарегистрирован: Суббота, 07 Февраль, 2009 19:25
Сообщения: 8
sa_t_an писал(а):
Для танкистов попробуйте сделать аналог var x: system.byte на дельфи и сравните результат в обероне и в вашей функции, после этого (и только после этого) прошу отписываться и показывать величину своей образованности!!!

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

вот что у меня получилось на дельфи и pow

код на обероне
Код:
MODULE test;

IMPORT File;

VAR
   f1   : LONGINT;
   lr   : LONGREAL;
BEGIN
   f1 := File.Create("oberon");
   lr := 12345.123456789;
   File.Write(f1, lr, 8);
   File.Close(f1);
END test.


код на дельфи
Код:
{$apptype console}
var
  f1      : file of byte;
  lr, lr2 : double;
begin
  lr:= 12345.123456789;

  assignfile(f1, 'delfi');
  rewrite(f1);

  blockwrite(f1, lr, 8);

  closefile(f1);

  assignfile(f1, 'oberon');
  reset(f1);

  blockread(f1, lr2, 8);

  closefile(f1);

  Writeln('delfi lr = ', lr, #10#13'pow oberon lr = ', lr2);
  Writeln;
  Writeln('delfi lr = ', lr:0:20, #10#13'pow oberon lr = ', lr2:0:20);
end.


содержание файлов
Код:
oberon:
00 00 00 C0 8F 1C C8 40
delfi:
9D 9B 6E CD 8F 1C C8 40


результат работы программы на дельфи:
Код:
H:\Pow!\op3>delfi.exe
delfi lr      =  1.23451234567890E+0004
pow oberon lr =  1.23451230468750E+0004

delfi lr      = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000


видно что у pow точность хуже, а у дельфи лучше
поэтому при переписи компиля на дельфи точность повысится


Последний раз редактировалось sdimitry85 Среда, 22 Июль, 2009 14:54, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 14:53 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
sa_t_an писал(а):
попробуйте сделать аналог var x: system.byte на дельфи и сравните результат в обероне и в вашей функции
Именно так я и поступил. Реализовал на XDS Oberon, реализовал на Delphi 7, сравнил, и после этого написал.
sa_t_an писал(а):
Для танкистов ... после этого (и только после этого) прошу отписываться и показывать величину своей образованности!!!
Если вас не устраивает результат, значит вы неправильно поставили задачу. А вообще, с таким отношением отправляйтесь-ка вы в игнор.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 14:55 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
sdimitry85 писал(а):
delfi lr = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000
имхо разницей в точности можно пренебречь
Ничего себе, можно пренебречь четвёртым знаком после запятой? Скорее уж, можно пренебречь реализацей POW!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 14:58 

Зарегистрирован: Суббота, 07 Февраль, 2009 19:25
Сообщения: 8
Александр Ильин писал(а):
sdimitry85 писал(а):
delfi lr = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000
имхо разницей в точности можно пренебречь
Ничего себе, можно пренебречь четвёртым знаком после запятой? Скорее уж, можно пренебречь реализацей POW!

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 15:36 

Зарегистрирован: Суббота, 04 Июль, 2009 19:22
Сообщения: 45
Вот вот вот и я про то же...

В принципе если делать полную совместимость, то потянутся и ошибки...

Вот смотрим функцию IEEE

Код:
FUNCTION RealToIEEE(CONST r:Single): Integer;
VAR
  Overlay: Integer ABSOLUTE r;
BEGIN
  RESULT := Overlay;
END;

FUNCTION IEEEToReal(hex: integer): Single;
VAR
  d : Single;
  Overlay: ARRAY[1..2] OF word ABSOLUTE d;
BEGIN
  Overlay[1] := Hi(hex)*$100+Lo(hex);
  hex:= hex shr 16;
  Overlay[2] := Hi(hex)*$100+Lo(hex);
  RESULT := d;
END;


Вот это полное преобразование в стандарт и обратно...

Вот так оно выглядит в редакторе (HEX) для двух одинаковых SYM файлов но разнокомпилируемых.
Так выходит (там в один бит разница) все равно придется делать не совместимость???
Нораз так, значит во всех реализациях оберонов должна повторятся данная особенность, так как фронт-энд используется один.

ХМ... Странно... Ну да ладно... Вынес это все в отдельные функции, что бы потом повышать точность...


Вложения:
-2.jpg
-2.jpg [ 85.71 КБ | Просмотров: 9848 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 16:37 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Вы очень путано изъясняетесь, поэтому и возникает такое недопонимание с участниками форума.

Судя по результатам вывода программы, представленной sdimitry85, между представлением REAL в Pow и в Delphi нет разницы. Зато есть разница перевода десятичного представления числа в стандарт IEEE - Pow делает это значительно менее точно, чем Delphi.

Устранение такой неточности на совместимость не повлияет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 17:03 

Зарегистрирован: Суббота, 04 Июль, 2009 19:22
Сообщения: 45
Оч хорошо, теперь о вопросах

Цитирую 2 страничную давность

Цитата:
PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
VAR i: INTEGER;
BEGIN i:=0;
WHILE i < len DO SYSTEM.VAL(CHAR, x[i]); INC(i) END
END SymWBytes;


Так вот что будет в -> х после вызова таким образом
lr:= 12345.123456789;


Ответ

Цитата:
Я что-то вообще не вижу, чтобы эта процедура что-то делала с x


Куда проще??? Я <удалено модератором> не спрашиваю что делает ФУНКЦИЯ а спрашиваю что будет в х.
Мне еще тогда хотелось тыкнуть для лучей видимости, но я сдержался
PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
Типа это приблуда так просто, для красоты что ли?

Но потом
Цитата:
Ещё раз для прапорщиков: ничего конвертировать не надо

Цитата:
Вам на Delphi перевести его?


Потом куча бреда с подтверждением своей значимости
Цитата:
Нет времени сесть подумать?


И только после этого адекватный ответ sdimitry85

Так вот у меня и появляются сомнения, когда я почти в каждом топике пишу, что перевожу код на PASCAL
и через 5 страниц глубокомысленных завсегдатаев форума вдруг осеняет - вроде
- Ааааааа :D , <удалено модератором>, да ты на PASCALе пишишь, а чо ж сразу не сказал???--

<удалено модератором>как я могу серьезно относиться к ответам???

Ну довайте я буду начинать топики с фразы

Я ПИШУ КОМПИЛЯТОР ОБЕРОНА НА PASCAL-е ...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 18:17 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Александр Ильин писал(а):
sdimitry85 писал(а):
delfi lr = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000
имхо разницей в точности можно пренебречь
Ничего себе, можно пренебречь четвёртым знаком после запятой? Скорее уж, можно пренебречь реализацей POW!
Вообще то это ошибка в 9-ом знаке.
Тип (LONG)REAL работает с вещественными с плавающей запятой, а не с фиксированной.
И да, во многих задачах 9-ым знаком можно пренебречь.
Хотя странно, что простейшее преобразование в LONGREAL приводит к такой ошибке.
Для LONGREAL нормальным является удерживать знаков 15.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 21:57 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Обсуждение аватар перенесено: viewtopic.php?p=32366#p32366


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 01:35 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
sa_t_an писал(а):
Цитирую 2 страничную давность
Код:
  PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
    VAR i: INTEGER;
  BEGIN i:=0;
    WHILE i < len DO SYSTEM.VAL(CHAR, x[i]); INC(i) END
  END SymWBytes;

Ответ
Цитата:
Я что-то вообще не вижу, чтобы эта процедура что-то делала с x

Мне еще тогда хотелось тыкнуть для лучей видимости, но я сдержался
PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
Типа это приблуда так просто, для красоты что ли?

Satan, если Вы спрашиваете - приводите хотя бы корректные примеры, а не наезжайте на тех, кто Вам отвечает. Приведённый код действительно ничего не делает с x. Он вообще ничего не делает! По одной простой причине - в оригинале он выглядит так:
Код:
PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
    VAR i: INTEGER;
  BEGIN i:=0;
    WHILE i < len DO SymWCh(SYSTEM.VAL(CHAR, x[i])); INC(i) END
  END SymWBytes;

Разницу видите? А VAR стоит там исключительно для того, чтобы не копировать весь массив x при вызове функции. Поскольку в стандартном Обероне IN нету ;)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 03:45 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Иван Горячев писал(а):
Satan, если Вы спрашиваете - приводите хотя бы корректные примеры, а не наезжайте на тех, кто Вам отвечает. Приведённый код действительно ничего не делает с x. Он вообще ничего не делает!
Спасибо, Иван. Он спросил "Так вот что будет в -> х после вызова таким образом..." (выделено мной), что на редкость двусмысленно. Я его вопрос прочитал так: "Как изменится содержимое переменной x после завершения работы процедуры". А он, как выяснилось лишь через страницу уточнений, хотел спросить, "что будет передано в процедуру с таким паметром при её вызове". Тонкость, как видно, в использовании правильного предлога. Выводы пусть каждый сделает сам.

Всем привет из Швейцарии, кстати! : )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 04:04 

Зарегистрирован: Суббота, 04 Июль, 2009 19:22
Сообщения: 45
Вот именно, я спросил что будет в х....

Теперь покажу ход моих мыслей, если бы я отвечал на вопрос...
Первое - отмотал бы на 2 странички назад 5-2=3 и почитал бы топик.

увидел бы такое
Цитата:
lr:= 12345.123456789;
SymWBytes(lr, 8 );


и подумал бы... Ага, раз lr передается по ссылке а не по значению значит в х будет область памяти где расположена lr, но так как она в представлении МАШКОДА+IEEE стандарт, то в x окажется кусок памяти длинной REAL(или LONGREAL) числа, то есть по просту то, что мы видим в HEX редакторе.

Значит ARRAY OF SYSTEM.BYTE это простой массив в который и передается побайтно это значение...
плюс добавил бы функцию которая это же делает на Delphi...

Но это если бы отвечал я...

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

Так что это не наезд, а вполне нормальная защитная реакция.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 04:19 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
sa_t_an писал(а):
И по моему для вопроса абсолютно не нужна функция, а достаточно заголовка что бы дотюмкать...
Так что это не наезд, а вполне нормальная защитная реакция.

Вот именно, сама функция не нужна. Но Вы её привели, причём зачем-то немножко поправили. Ну да ладно, проехали.

А что касается точности REALов, то я сравнил процедуры OPS.Number из Pow! и DevCPS.Number из ББ. В ББ как раз при чтении вещественных происходят некие дополнительные телодвижения, отсутствующие в Pow. Может быть точность теряется именно здесь, ещё до компиляции?

Александр Ильин писал(а):
Всем привет из Швейцарии, кстати! : )

Ночные бдения? :roll:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 04:53 

Зарегистрирован: Суббота, 04 Июль, 2009 19:22
Сообщения: 45
Там скорее всего неверная реализация стандарта IEEE(она ведь закрытая до времени была)... У меня на проверке некоторые биты не совпадали, я промучился часа два, потом взял исходные проверенные данные и по ним понял, что что то не то, поэтому и закрались кой какие сомнения, но во общем это дело уже прошлое, просто на будущее вдруг кто столкнется с неточностями в расчетах и т.д...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 05:54 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
sa_t_an писал(а):
Вот смотрим функцию IEEE
Код:
FUNCTION RealToIEEE(CONST r:Single): Integer;
VAR
  Overlay: Integer ABSOLUTE r;
BEGIN
  RESULT := Overlay;
END;

FUNCTION IEEEToReal(hex: integer): Single;
VAR
  d : Single;
  Overlay: ARRAY[1..2] OF word ABSOLUTE d;
BEGIN
  Overlay[1] := Hi(hex)*$100+Lo(hex);
  hex:= hex shr 16;
  Overlay[2] := Hi(hex)*$100+Lo(hex);
  RESULT := d;
END;

Вот это полное преобразование в стандарт и обратно...


Кстати, я не понял. Если мы из reala в integer перегоняем простым проецированием, то зачем нам в обратную сторону пляски с бубном? На мой любительский взгляд либо оба преобразования должны идти через absolute, либо оба - через вот эти вот сложения и умножения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 07:28 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Александр Ильин писал(а):
sdimitry85 писал(а):
delfi lr = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000
имхо разницей в точности можно пренебречь
Ничего себе, можно пренебречь четвёртым знаком после запятой? Скорее уж, можно пренебречь реализацей POW!

Похоже, в POW! LONGREAL на самом деле занимает 4 байта, а не 8...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 15:00 

Зарегистрирован: Суббота, 04 Июль, 2009 19:22
Сообщения: 45
Цитата:
либо оба - через вот эти вот сложения и умножения


Это я просто по байтно проверял что там происходит и сравнивал с POW да так в тесте и оставил...

И выходит что в POW длинна
INTEGER - 2
LONGINT - 4
а SHORTINT - как бы соответствует байту...
ну и т.д.

А в других оберонах так же или несколько иначе?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 25 Июль, 2009 00:59 

Зарегистрирован: Суббота, 04 Июль, 2009 19:22
Сообщения: 45
Ну что, вижу интерес к теме все больше и больше со стороны обероновцев. Оно и понятно, получить Delphi Rad с синтаксисом Оберона кому ж не охото? Разве токма тому, кто жить не может без XDS среды разработки... Ну еще может быть БлэкБоксерам, завидую я им. Куда уж VS Studio или CodeGear RAD до ББ в плане удобства, юзабилити да и вообще в плане компиляции. Сравнивать их и ББ это равнозначно сравнению Notepad.exe и MS Word... Ну да речь не об этом.

Осталься предпоследний вопрос и последний.

Первый - а что же такое все таки SET с точки зрения Delphi. Тоесть на что он похож в представлении Делфийца.
Луче в по байтном виде. Или кучу примеров на Обероне с типом SET (просто заголовки)
И каким аналогом возможно его заменить (например массивом... и т.д.)

И последний вопрос (тоже по байтный) что же все таки происходит с числом(типом) от функции SHORT
Вроде если для LONGINT то было AABBCCDD а стало AABB или стало CCDD или стало BBCC
Функцию (желательно битовую) живую для обозрения.

После решения этих двух вопросов фронт-энд компилер будет готов.
Вернее он уже готов и компилирует модули, экспортирует их (если в них не используются массивы(как вариант SET))

И останется уже вопрос эффективности компилирования модулей и их загрузка. То есть как лучше сделать список импорта рекурсивно, или сразу открыть все модули и распарсить секцию IMPORT, или отслеживать изменение исходного файла и записывать время изменения в него же....


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 135 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


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

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB