Я бы представлял все значения в виде целых чисел и масштабировал их соответствующим образом.Например, когда вам нужно три десятичных знака, 0.124
будет представлен как 124
.Это хорошо, потому что сложение и вычитание тривиальны.При умножении двух чисел a
и b
вам придется разделить результат на 1000
, чтобы получить правильное представление.Разделив работы, умножив результат на 1000
.
Вы все еще должны решить проблемы с округлением, но это не очень сложно.По крайней мере, если вы не приблизитесь к максимально представимому целому числу (я не помню, если оно 2^31-1
или 2^30-1
).
Вот код:
\def\fixadd#1#2#3{%
#1=#2\relax
\advance #1 by #3\relax
}
\def\fixsub#1#2#3{%
#1=#2\relax
#1=-#1\relax
\advance #1 by #3\relax
#1=-#1\relax
}
\def\fixmul#1#2#3{%
#1=#2\relax
\multiply #1 by #3\relax
\divide #1 by 1000\relax
}
\def\fixdiv#1#2#3{%
#1=#2\relax
\divide #1 by #3\relax
\multiply #1 by 1000\relax
}
\newcount\numa
\newcount\numb
\newcount\numc
\numa=1414
\numb=2828
\fixmul\numc\numa\numb
\the\numc
\bye
Операции смоделированы после машины с тремя регистрами, где первый - место назначения, а два других - операнды.Округление после умножения и деления, включая угловые дела для очень больших или очень маленьких чисел, оставлено вам в качестве упражнения.