(La) TeX Base 10 арифметика с фиксированной точкой - PullRequest
2 голосов
/ 10 июля 2010

Я пытаюсь реализовать десятичную арифметику в (La) TeX. Я пытаюсь использовать измерения для хранения значений. Я хочу, чтобы арифметика была точной с некоторым (фиксированным) числом десятичных знаков. Если я использую 1pt в качестве своей базовой единицы, то это не сработает, потому что \ div округляет, поэтому 1pt / 10 дает 0.09999pt. Если я использую что-то вроде 1000sp в качестве своей базовой единицы, то получаю рабочую арифметику с фиксированной точкой с 3 десятичными знаками, но я не могу найти простой способ форматирования чисел. Если я попытаюсь преобразовать их в pt, чтобы я мог использовать механизм отображения TeX, у меня та же проблема с \ делением.

Как мне решить эту проблему или обойти ее?

Ответы [ 2 ]

3 голосов
/ 10 июля 2010

Пакет fp обеспечивает арифметику с фиксированной запятой для LaTeX. Проект LaTeX3 в настоящее время реализует нечто подобное в составе пакета expl3. Код в настоящее время отсутствует в CTAN, но его можно получить из SVN (или появится, когда произойдет следующее обновление из SVN в CTAN).

2 голосов
/ 10 июля 2010

Я бы представлял все значения в виде целых чисел и масштабировал их соответствующим образом.Например, когда вам нужно три десятичных знака, 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

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

...