OberonCore
https://forum.oberoncore.ru/

SHORTREAL >= LONGINT
https://forum.oberoncore.ru/viewtopic.php?f=29&t=2849
Страница 1 из 1

Автор:  Rifat [ Вторник, 14 Сентябрь, 2010 21:06 ]
Заголовок сообщения:  SHORTREAL >= LONGINT

В документации 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 и по поводу игнорирования наименьшего числа в диапазоне целых чисел?

Автор:  Александр Ильин [ Вторник, 14 Сентябрь, 2010 21:12 ]
Заголовок сообщения:  Re: SHORTREAL >= LONGINT

Я думаю, что о баге в сканере надо сообщить в Oberon Microsystems, желательно с патчем.

Автор:  Илья Ермаков [ Вторник, 14 Сентябрь, 2010 21:13 ]
Заголовок сообщения:  Re: SHORTREAL >= LONGINT

SHORTREAL, REAL и их особенности диктуются а) стандартом IEEE; б) поведением сопроцессора x86, основанном на IEEE.

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

Автор:  QWERTYProgrammer [ Среда, 15 Сентябрь, 2010 01:08 ]
Заголовок сообщения:  Re: SHORTREAL >= LONGINT

Похоже есть также проблема при 16-ричной записи: результатом
Код:
x := 8000000000000000L;

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

...

Автор:  Евгений Темиргалеев [ Среда, 15 Сентябрь, 2010 08:29 ]
Заголовок сообщения:  Re: SHORTREAL >= LONGINT

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 обрабатывает верно...

Автор:  Сергей Губанов [ Среда, 15 Сентябрь, 2010 10:15 ]
Заголовок сообщения:  Re: SHORTREAL >= LONGINT

Rifat писал(а):
Решил проверить, действительно ли SHORTREAL включает все значения из LONGINT. Написал небольшой тест:
А с чего Вы взяли, что SHORTREAL включает все значения из LONGINT?

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

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

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

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

Автор:  QWERTYProgrammer [ Среда, 15 Сентябрь, 2010 23:30 ]
Заголовок сообщения:  Re: SHORTREAL >= LONGINT

Евгений Темиргалеев писал(а):
Это способ записать -2^63 в коде.

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/