Язык программирования Форт



         

Глава 4. Еще об арифметических операциях - часть 18


Число на входе выглядит не очень изящно, поскольку в него нельзя еще ввести десятичную запятую. Как мы вскоре увидим, при вводе числа двойной длины необходимо указывать положение десятичной точки, на основании этого Форт распознает числа двойной длины. Но при расчетах Форт игнорирует положение десятичной точки. Как вы видели на примере $CENTS, программист не всегда должен заботиться о масштабировании, эта работа может быть оставлена компьютеру. И не обязательно, чтобы масштабный коэффициент был кратен 10. Вот, например, слово, которое берет из стека число дюймов и переводит их в футы и дюймы: : .FTTN (дюймы -->) 12 /MOD . ." футов и" . ." дюймов" ; Очевидно, можно сделать преобразование в обратную сторону. Определим слово : TOINCHES (футы дюймы - дюймы) SWAP 12 * + ;

Если ввести 10 6 TOINCHES, то мы увидим в стеке длину в дюймах 126.

Умножение на дроби

Предположим, что вы хотите умножить число на 3/4 с помощью калькулятора. Вы можете в действительности умножить на 0.75, зная, что 0.75 равно 3/4. Так как вы не сможете умножить на 0.75 с помощью целых чисел, вы можете на Форте вычислить дробное выражение, умножая на 3/4. Однако позвольте, просто так нельзя разделить 3 на 4, а потом умножить на результат, так как 3 4 / дает 0. Поэтому нужно сначала умножить число на 3, а затем произвести деление, т.е. вам нужно применить оператор */ (он, как и /MOD, называется масштабным оператором). Таким образом, выражение 3 4 / 100 * дает неверный результат 0, в то время как 100 34*/ дает правильный результат 75. Напомним, что во избежание переполнения */ сохраняет промежуточный результат умножения в виде 32-разрядного числа.

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


Содержание  Назад  Вперед