Автор Тема: [Oberon-07/11] Беззнаковое целое.  (Прочитано 23970 раз)

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #60 : Декабрь 23, 2012, 03:33:20 pm »
2Oleg N. Cher:
Ничего не имею против Вирта, и дай Бог ему здоровья. Но мне не даёт покоя ваш пример: http://oberspace.dyndns.org/index.php/topic,398.msg11929.html#msg11929
Я так и не понял одобряете ли вы использование в нём суффикса "L".
Если не одобряете, то код работать не будет. Если же одобряете, то я тогда готов предложить более простой вариант, который хоть и использует 64 бит, но при этом равносилен вашему, с учётом замены "H" на "L":
VAR i: LONGINT; (* Это INTEGER 64 бит. *)

PS: Не совсем понял при чём тут АО, ведь вы говорили про "правильный Оберон" - КП.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #61 : Декабрь 23, 2012, 04:12:11 pm »
Точнее:
VAR i: LONGINT; (* Это INTEGER 64 бит. *)
...
arr[i]

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #62 : Декабрь 23, 2012, 04:53:47 pm »
2Oleg N. Cher:
Ничего не имею против Вирта, и дай Бог ему здоровья. Но мне не даёт покоя ваш пример: http://oberspace.dyndns.org/index.php/topic,398.msg11929.html#msg11929
Я так и не понял одобряете ли вы использование в нём суффикса "L".
Одобряю конечно. Просто подымался вопрос: как индексировать с помощью 32-битной переменной массивы, для индексации которых не хватает разрядности знакового целого 32 бита. Вот и был предложен вариант для КП, который теоретически правилен, хотя может и не совсем эффективно компилироваться (из-за приведения к 64 бит).

Ну а если говорить о том, как эта задача решается в Обероне-07, то тут я пас.

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #63 : Декабрь 25, 2012, 06:51:36 am »
Единственный выход который я вижу, использовать LONGREAL (и надяеться что во всех реализациях этого Оберона LONGREAL будет хотя бы 64битным).
А если реализация для 16-битной системы? ;) На все расчитывать не стоит. А в конкретной может быть какой-нибудь SYSTEM.UINT32.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #64 : Январь 16, 2013, 06:49:07 am »
Таки я нашел ответ на свой вопрос - почему Вирт выпилил беззнаковые целые в "Краткой истории Modula и Lilith"

Тип CARDINAL

Как можно объяснить введение типа CARDINAL — типа натуральных чисел — в виде еще одного базового типа? Потребность эта возникла из желания представлять адреса как числовые типы.
Lilith была 16-разрядной машиной с памятью 216 слов, поэтому нельзя было позволить себе такую роскошь,  как  наличие  бесполезного  бита  знака.  На  первых  порах  после  ввода  этого  типа  все выглядело  благополучно,  но  затем  возникло  несколько  проблем.  Как,  например,  можно эффективно реализовать сравнение i < c? Вопрос это легко снять, если смешанные выражения запрещены.
Для целочисленной (знаковой) и натуральной (беззнаковой) арифметики требуются два разных набора инструкций. Даже если одна и та же инструкция может использоваться для сложения, все равно  существует  различие  в  определении  переполнения.  Для  деления  ситуация  еще  более проблематична.  В  математике  частное q = x DIV y и  остаток r = x MOD y определяются отношениями
x = q * y + r,  0 <= r < y
Целочисленное  деление  в  противоположность  вещественному  асимметрично  в  отношении 0.
Например,
 10 DIV 3 = 3   10 MOD 3 = 1
-10 DIV 3 = 4  -10 MOD 3 = 2
Большинство  компьютеров,  однако,  предоставляет  инструкции,  которые  неверны  в  отношении данного определения. Они трактуют целочисленное деление наподобие вещественного деления, симметричного относительно 0:
(-x) DIV y = -(x DIV y)
(-x) MOD y = -(x MOD y)
Если  целочисленное  деление  реализуется  корректно,  то  деление  на  число  в  степени  двойки может  быть  реализовано  более  эффективно  путем простых  сдвигов.  В  случае  неверных инструкций деления это невозможно:
x*2n = left(x,n)
x DIV 2n = right(x,n)
Следующие  процессоры  помимо  прочего  осуществляют  целочисленное  деление  вопреки математическому  определению: Motorola 680x0, Intel 80x86, Intel 80960, DEC VAX, IBM Power.
Хуже того, язык Ada возвел эту ошибку в ранг стандарта.
Дабы  не  вступать  в  противоречие  с  другими,  мы  решили  принять  неверную  арифметику.
Оглядываясь назад, можно с уверенностью сказать, что это было, конечно, серьезной ошибкой.
Компилятор использовал инструкции сдвига для умножения и деления чисел в степенях двойки только в случае выражений типа CARDINAL.
В общем и целом введение типа CARDINAL объясняется необходимостью обработки 16-разрядных адресов.  С  точки  зрения  математиков (которые  изобрели  отрицательные  числа  ради алгебраической  полноты)  его  следовало  бы  назвать  шагом  назад,  так  как  он  создавал  новые сложности  для  программиста,  которых  до  этого  не  было.  Рассмотрим,  к  примеру,  следующие операторы, выполняющие действие Q для x = N-1, ..., 1, 0:
x := N-1;
WHILE x >= 0 DO Q; x := x-1 END
Если "x" типа INTEGER, то  программа  корректна,  но  если "x" типа CARDINAL, то  такая  запись приводит  к  переполнению,  которого  можно  избежать  путем  корректной  альтернативной формулировки
 x := N;
WHILE x > 0 DO x := x-1; Q END

Приход 6 лет  спустя 32-разрядных  компьютеров  дал  возможность  забыть  тип CARDINAL. Этот эпизод показал, насколько неадекватность аппаратуры может заставить разработчика языка идти по  пути  усложнений  и  компромиссов,  если  тот  хочет  в  полной  мере  использовать  доступные аппаратные  возможности.  Урок  состоит  еще  и  в  том,  что  память  размером 2n  требует
целочисленной арифметики как минимум с (n+1) разрядом.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #65 : Январь 16, 2013, 07:37:12 am »
Целочисленное  деление  в  противоположность  вещественному  асимметрично  в  отношении 0.
Например,
 10 DIV 3 = 3   10 MOD 3 = 1
-10 DIV 3 = 4  -10 MOD 3 = 2
Большинство  компьютеров,  однако,  предоставляет  инструкции,  которые  неверны  в  отношении данного определения. Они трактуют целочисленное деление наподобие вещественного деления, симметричного относительно 0:
(-x) DIV y = -(x DIV y)
(-x) MOD y = -(x MOD y)
Если  целочисленное  деление  реализуется  корректно,  то  деление  на  число  в  степени  двойки может  быть  реализовано  более  эффективно  путем простых  сдвигов.  В  случае  неверных инструкций деления это невозможно:
x*2n = left(x,n)
x DIV 2n = right(x,n)
Следующие  процессоры  помимо  прочего  осуществляют  целочисленное  деление  вопреки математическому  определению: Motorola 680x0, Intel 80x86, Intel 80960, DEC VAX, IBM Power.
Хуже того, язык Ada возвел эту ошибку в ранг стандарта.
В Аде есть две операции вычисления остатка от деления -- rem (остаток от деления, округляющего к нулю) и mod (остаток от деления, округляющего к -Inf).
Но операция деления только одна -- округляющая к нулю.
А вот в Хаскелле есть два набора quot и rem (округляют к нулю) и div и mod (округляют к -Inf):
(x `quot` y)*y + (x `rem` y) == x
(x `div`  y)*y + (x `mod` y) == x

  10  `divMod`  3 == ( 3, 1)      10  `quotRem`  3 == ( 3,  1)
(-10) `divMod`  3 == (-4, 2)    (-10) `quotRem`  3 == (-3, -1)
( -9) `divMod` 12 == (-1, 3)    ( -9) `quotRem` 12 == ( 0, -9)
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #66 : Январь 16, 2013, 10:49:17 am »
Сильно натянутые причины для исключения беззнаковых целых. Не удивлюсь, если и диапазоны он выпилил по сходным же причинам, типа вдруг кто-нибудь забудет что это диапазон

DddIzer

  • Гость
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #67 : Январь 16, 2013, 10:54:37 am »
Сильно натянутые причины для исключения беззнаковых целых. Не удивлюсь, если и диапазоны он выпилил по сходным же причинам, типа вдруг кто-нибудь забудет что это диапазон
возможно,  а может быть просто по тому,  что в реальных оберонных задачах (лежащих в области эффективного решения с помощью Оберона - в его понимании) возможностей напомнить об этом компилятором не очень много.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #68 : Январь 16, 2013, 07:08:40 pm »
Таки я нашел ответ на свой вопрос - почему Вирт выпилил беззнаковые целые в "Краткой истории Modula и Lilith"
Kemet, большое спасибо! Очень ценная инфа.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #69 : Январь 16, 2013, 07:10:46 pm »
Цитировать
Большинство  компьютеров,  однако,  предоставляет  инструкции,  которые  неверны  в  отношении данного определения. Они трактуют целочисленное деление наподобие вещественного деления, симметричного относительно 0:
(-x) DIV y = -(x DIV y)
(-x) MOD y = -(x MOD y)
Если  целочисленное  деление  реализуется  корректно,  то  деление  на  число  в  степени  двойки может  быть  реализовано  более  эффективно  путем простых  сдвигов.  В  случае  неверных инструкций деления это невозможно:
x*2n = left(x,n)
x DIV 2n = right(x,n)
Следующие  процессоры  помимо  прочего  осуществляют  целочисленное  деление  вопреки математическому  определению: Motorola 680x0, Intel 80x86, Intel 80960, DEC VAX, IBM Power.
А я блин голову ломал почему оно так  :)