Applesoft BASIC: SQR возвращает целое число для меньших чисел, но не для больших?

Итак, сразу к делу. Я использую AppleSoft BASIC, но есть проблемы с функцией SQR. Кажется, что он выдает целые числа при работе с меньшими идеальными квадратами, но плавает при работе с большими. Например:

У меня есть этот фрагмент кода, который проверяет, является ли переменная целым числом, и печатает «ОК», если это так:

] IF INT(X) = X THEN PRINT "OK"

Когда X определяется как

] X = SQR(16)

] PRINT X
4

функция печатает OK.

Однако, когда X определяется как

] X = SQR(7744)

] PRINT X
88

функция ничего не печатает.

(Обратите внимание, что ] является подсказкой и не включена в код.)

Абсурд, не так ли? Мне удавалось воспроизвести его каждый раз на моем личном Apple //e, так что вы сможете воспроизвести его и на своем. (Это 1986 год! У каждого должен быть такой.)

Может ли SQR давать последовательный результат? Есть ли какая-то внутренняя разница между SQR (16) и SQR (7744)?

P.S. Я был пользователем S.O. уже больше года, но почему-то мой аккаунт исчез. Так что нет, я не просто "начинаю".


person Lim Ding Wen    schedule 25.06.2014    source источник
comment
Это всегда помогает, задавая вопрос, чтобы иметь реальный вопрос.   -  person President James K. Polk    schedule 26.06.2014
comment
Отредактировано. Спасибо за комментарий.   -  person Lim Ding Wen    schedule 16.07.2014


Ответы (1)


Я откопал кое-какие улики/историю. Из моей копии Basic Programming Manual Applesoft ][ (1978, Apple Computer Inc.) — местами добавлено небольшое выделение:

p18:

ДЕЙСТВИТЕЛЬНЫЕ, ЦЕЛЫЕ И СТРОКОВЫЕ ПЕРЕМЕННЫЕ

В APPLESOFT BASIC используются переменные трех разных типов. До сих пор мы использовали только один тип — реальную точность. Числа в этом режиме отображаются с точностью до девяти знаков после запятой и могут варьироваться примерно до 10 в 38-й степени. APPLESOFT преобразует ваши числа из десятичных в двоичные для внутреннего использования, а затем обратно в десятичные, когда вы просите его НАПЕЧАТАТЬ ответ. Из-за ошибок округления и других непредсказуемых факторов внутренние математические процедуры, такие как квадратный корень, деление и экспонента, не всегда дают точное число, которое вы ожидали.

Все арифметические операции выполняются с реальной точностью. Целые числа и целочисленные значения переменных преобразуются в реальную точность, прежде чем они используются в расчетах. Функции SIN, COS, ATN, TAN, SQR, LOG, EXP и RND также преобразуют свои аргументы в реальную точность и выдают свои результаты как таковые.

p102:

SQR (aexpr) Возвращает положительный квадратный корень. Это специальная реализация, которая выполняется быстрее, чем ^.5

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

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

person busse    schedule 17.09.2014