OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 17 Август, 2019 23:36

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: SHORTREAL >= LONGINT
СообщениеДобавлено: Вторник, 14 Сентябрь, 2010 21:06 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 804
Откуда: Казань
В документации BlackBox в разделе Language Report написано:
Цитата:
Types 4 to 7 are integer types, types 8 and 9 are real types, and together they are called numeric types. They form a hierarchy; the larger type includes (the values of) the smaller type:

REAL >= SHORTREAL >= LONGINT >= INTEGER
>= SHORTINT >= BYTE

Решил проверить, действительно ли SHORTREAL включает все значения из LONGINT.
Написал небольшой тест:
Код:
MODULE MyTest;

   IMPORT Log;

   PROCEDURE Do*;
   VAR x, y, z: LONGINT;
      f: REAL;
   BEGIN
      x := -9223372036854775807;
      f := x;
      y := ENTIER(f);
      IF x = y THEN Log.String("Equal");
      ELSE Log.String("Not equal");
      END;
      Log.Ln;
      z := y - x;
      Log.Int(SHORT(z)); Log.Ln;
   END Do;

END MyTest.

Оказалось, что после обратного преобразования вещественного числа в целое, то результат уже другой.

Еще одна проблемка заключается в том, что в коде нельзя написать число -9223372036854775808, хотя это число входит в диапазон LONGINT. Почему это происходит понятно, так как сканер отдельно считывает знак "-" и отдельно число считывает в переменную типа LONGINT, но так как положительное число 9223372036854775808 не входит в диапазон LONGINT, то возникает ошибка. Скорее всего это было сделано для упрощения, но думаю, что не надо забывать и про вторую часть высказывания "Make it as simple as possible, BUT NOT SIMPLE".

Кто что думает по поводу несовместимости SHORTREAL и LONGINT и по поводу игнорирования наименьшего числа в диапазоне целых чисел?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SHORTREAL >= LONGINT
СообщениеДобавлено: Вторник, 14 Сентябрь, 2010 21:12 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2309
Откуда: Россия, Томск
Я думаю, что о баге в сканере надо сообщить в Oberon Microsystems, желательно с патчем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SHORTREAL >= LONGINT
СообщениеДобавлено: Вторник, 14 Сентябрь, 2010 21:13 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9129
Откуда: Россия, Орёл
SHORTREAL, REAL и их особенности диктуются а) стандартом IEEE; б) поведением сопроцессора x86, основанном на IEEE.

Так что в определении языка это учесть принципиально не возможно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SHORTREAL >= LONGINT
СообщениеДобавлено: Среда, 15 Сентябрь, 2010 01:08 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 233
Похоже есть также проблема при 16-ричной записи: результатом
Код:
x := 8000000000000000L;

оказывается
Код:
-9223372036854775808

...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SHORTREAL >= LONGINT
СообщениеДобавлено: Среда, 15 Сентябрь, 2010 08:29 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
QWERTYProgrammer писал(а):
Похоже есть также проблема при 16-ричной записи: результатом...
8000000000000000L = "набор битов" -9223372036854775808. всё верно

Это способ записать -2^63 в коде.

В сообщ. о языке это указано
Language Report писал(а):
2. Numbers are (unsigned) integer or real constants. The type of an integer constant is INTEGER if the constant value belongs to INTEGER, or LONGINT otherwise (see 6.1). If the constant is specified with the suffix 'H' or 'L', the representation is hexadecimal, otherwise the representation is decimal. The suffix 'H' is used to specify 32-bit constants in the range -2147483648 .. 2147483647. At most 8 significant hex digits are allowed. The suffix 'L' is used to specify 64-bit constants.
Сканер работает верно --- в 10-м представлении он должен распознавать только неотрицательные LONGINT.

Strings.StringToInt, который читает любые целые в 10-м виде, -2^63 обрабатывает верно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SHORTREAL >= LONGINT
СообщениеДобавлено: Среда, 15 Сентябрь, 2010 10:15 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Rifat писал(а):
Решил проверить, действительно ли SHORTREAL включает все значения из LONGINT. Написал небольшой тест:
А с чего Вы взяли, что SHORTREAL включает все значения из LONGINT?

Формальная запись:

REAL >= SHORTREAL >= LONGINT >= INTEGER >= SHORTINT >= BYTE

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

SHORTREAL - 4 байта, LONGINT - 8 байтов. Зачем тест писать понадобилось если и так ясно, что изоморфизм невозможен...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SHORTREAL >= LONGINT
СообщениеДобавлено: Среда, 15 Сентябрь, 2010 23:30 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 233
Евгений Темиргалеев писал(а):
Это способ записать -2^63 в коде.

Да все правильно. Поздно вечером лучше не писать...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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