すべての値を整数で表し、適切にスケーリングします。たとえば、小数点以下3桁が必要な場合、0.124
はとして表され124
ます。足し算と引き算は簡単なので、これは素晴らしいことです。a
2つの数値とを乗算する場合、適切な表現を取得するには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
操作は、3つのレジスターマシンをモデルにしています。最初のレジスターは宛先で、他の2つはオペランドです。非常に大きい数または非常に小さい数のコーナーケースを含む、乗算と除算の後の丸めは、演習として残されます。