2

(La)TeXで10進演算を実装しようとしています。値を保存するために寸法を使用しようとしています。算術演算を小数点以下の桁数(固定)に正確にしたいと思います。基本単位として1ptを使用すると、\ divideが切り捨てられるため、これは失敗します。したがって、1pt/10は0.09999ptになります。1000spのようなものを基本単位として使用すると、小数点以下3桁の固定小数点演算が機能しますが、数値をフォーマットする簡単な方法がわかりません。TeXの表示メカニズムを使用できるように、それらをptに変換しようとすると、\divideでも同じ問題が発生します。

この問題を修正するにはどうすればよいですか、または回避するにはどうすればよいですか?

4

2 に答える 2

3

fp パッケージは、LaTeX の固定小数点演算を提供します。LaTeX3 プロジェクトは現在、expl3 バンドルの一部として同様のものを実装しています。コードは現在 CTAN にはありませんが、SVN から取得できます (または、SVN から CTAN への次の更新が行われるときに表示されます)。

于 2010-07-10T15:19:58.517 に答える
2

すべての値を整数で表し、適切にスケーリングします。たとえば、小数点以下3桁が必要な場合、0.124はとして表され124ます。足し算と引き算は簡単なので、これは素晴らしいことです。a2つの数値とを乗算する場合、適切な表現を取得するにはb、結果をで除算する必要があります。1000除算は、結果に。を掛けることによって機能し1000ます。

丸めの問題を修正する必要がありますが、これはそれほど難しいことではありません。少なくとも、表現可能な最大の整数に近づかない場合(それがまたはであるかどうかは覚えていません2^31-12^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つはオペランドです。非常に大きい数または非常に小さい数のコーナーケースを含む、乗算と除算の後の丸めは、演習として残されます。

于 2010-07-09T21:18:19.203 に答える