Forth
http://www.fforum.winglion.ru/

представление чисел
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2221
Страница 2 из 5

Автор:  Pretorian [ Пн авг 03, 2009 06:56 ]
Заголовок сообщения:  Re: представление чисел

mOleg писал(а):
В различных Форт-системах числа из текстового представления преобразуются во внутреннее представление (бинарное) несколько различным образом. К примеру, ввод длинного числа (разрядностью более CELL) в ряде систем приведет к появлению на стеке данных числа двойной длины, в ряде систем числа одинарной длины, а в ряде систем к ошибке. Причем, слишком длинные числа, в том же СПФ, к примеру обрезаются сверху, то есть теряются старшие разряды, если число не влазит в CELL

То же самое с разделительной точкой, то есть:
1234.1234 в одних системах будет распознано как: 0 12341234 , в то время как в других, как: 1234 1234 , плюс порядок хранения пар значений двойной длины от системы к системе меняется, то есть 1.2 в одном случае будет выглядеть как 1 2 а в другом 2 1 .

Вот, собственно возник вопрос, как лучше сделать? (удобнее, правильнее)

Не вижу тут проблемы, все закономерно у x32 своя точность, у x64 своя. На то она и разрядность, что бы давать какие то преимущества. Мое мнение отбрасывать старшие разряды, так оно будет правильнее (если есть переполнение то в этом ни кто не виноват ;) ).

Автор:  вопрос [ Пн авг 03, 2009 08:37 ]
Заголовок сообщения: 

Ну, лучше такой алгоритм, где выдаётся предупреждение - можно ... как в Эйфории - если разряд превышает допустимые пределы - автоматический перевод в числа с плавающей точкой (если я не путаю)

Автор:  Pretorian [ Пн авг 03, 2009 10:37 ]
Заголовок сообщения: 

Да флага FALSE будет достаточно если разрядность превышает.

Автор:  in4 [ Пн авг 03, 2009 11:00 ]
Заголовок сообщения: 

А если в библиотеку добавить тестирующий код (или примерчик), который определяет и сообщает об этих особенностях систем, например, как хранятся числа на стеке, какая максимальная разрядность...

Вот кусок стандарта:
Код:
3.1.4.1   
         Double-cell integers
On the stack, the cell containing the most significant part of a double-cell integer shall
be above the cell containing the least significant part.
The implementation-defined range of double-cell signed integers shall include
{-2147483647..+2147483647}.
The implementation-defined range of double-cell non-negative integers shall include
{0..2147483647}.
The implementation-defined range of double-cell unsigned integers shall include
{0..4294967295}.  Placing the single-cell integer zero on the stack above a single-cell
unsigned integer produces a double-cell unsigned integer with the same value.  See 3.2.1.1
Internal number representation.
Вот константы для максимальных чисел:
Код:
    MAX-D              d     yes  largest usable signed double number
    MAX-N              n     yes  largest usable signed integer
    MAX-U              u     yes  largest usable unsigned integer
    MAX-UD             ud    yes  largest usable unsigned double number

А вот это мне не нравится:
Код:
8.3.2   
       Text interpreter input number conversion
When the text interpreter processes a number that is immediately followed by a decimal
point and is not found as a definition name, the text interpreter shall convert it to a
double-cell number.
For example, entering DECIMAL 1234 leaves the single-cell number 1234 on the stack,
and entering DECIMAL 1234. leaves the double-cell number 1234 0 on the stack.
Мне более удобно иметь точку в середине строки - 4-символьные части разделять...

Автор:  Hishnik [ Пн авг 03, 2009 11:37 ]
Заголовок сообщения: 

Мда. Ну ладно еще, в начале 90-х не везде был сопроцессор, и можно было повыпендриваться с утилизацией разделительной точки. Но сейчас-то кого еще надо насмешить подходом "у всех точка - признак вещественного числа, а у нас - двойной длины!". Это что, по принципу "юродивых не обижают"?

Автор:  in4 [ Пн авг 03, 2009 15:22 ]
Заголовок сообщения: 

Вариант оставить точку для вещественных, а части двойного разделять, например, двоеточием мне нравится еще больше! :)

Автор:  in4 [ Пн авг 03, 2009 15:23 ]
Заголовок сообщения: 

in4 писал(а):
Вариант оставить точку для вещественных, а части двойного разделять, например, двоеточием - мне нравится еще больше! :)

Автор:  Hishnik [ Пн авг 03, 2009 15:41 ]
Заголовок сообщения: 

in4 писал(а):
Вариант оставить точку для вещественных, а части двойного разделять, например, двоеточием мне нравится еще больше! Smile

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

Автор:  mOleg [ Пн авг 03, 2009 21:12 ]
Заголовок сообщения: 

то есть предлагаете формат записи чисел двойной длины:
1231:3423 ?
тогда если просто число типа; 1234313478 не влазит в CELL, то ошибку выдавать?
я правильно понял?

Автор:  вопрос [ Пн авг 03, 2009 22:15 ]
Заголовок сообщения: 

Хищник писал(а):
in4 писал(а):
Вариант оставить точку для вещественных, а части двойного разделять, например, двоеточием мне нравится еще больше! Smile

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

ВООбще, следует стремиться избегать беспричинной оригинальности

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

Автор:  in4 [ Вт авг 04, 2009 01:26 ]
Заголовок сообщения: 

mOleg писал(а):
то есть предлагаете формат записи чисел двойной длины:
1231:3423 ?
Да. Еще и 0x или $ в начале для HEX.
mOleg писал(а):
тогда если просто число типа; 1234313478 не влазит в CELL, то ошибку выдавать?
Не ошибку, а предупреждение (Warning) бы, что отсекаются старшие разряды...

Автор:  Hishnik [ Вт авг 04, 2009 13:29 ]
Заголовок сообщения: 

mOleg писал(а):
то есть предлагаете формат записи чисел двойной длины:
1231:3423 ?

Тогда уж 12345678:9ABCDEF0

Автор:  mOleg [ Вт авг 04, 2009 19:22 ]
Заголовок сообщения: 

так, хорошо, а где еще числа двойной длины через : пишутся?
и как обычно такое число расценивается, то есть, что обычно обозначает место двоеточия?
тут может быть два варианта:
1) ничего не значит
2) отделяет содержимое младшего разряда от старшего

насчет шестнадцатиричных чисел, я уже выбрал вариант с 0x

Автор:  Wlad [ Вт авг 04, 2009 23:11 ]
Заголовок сообщения: 

Раз уж выбрали 0x, то уже тогда можно и L в конце для длинных добавлять... :)

Автор:  вопрос [ Вт авг 04, 2009 23:21 ]
Заголовок сообщения: 

Wlad писал(а):
Раз уж выбрали 0x, то уже тогда можно и L в конце для длинных добавлять... :)

ТОчно, и 0 (NULL) перед восьмеричными.

Страница 2 из 5 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/