Н.В. Клиначев

Алгоритм вычисления натурального логарифма для микроконтроллеров с целочисленным АЛУ

Рабочие файлы: [IQsin] [IQatan2] [IQsqrt] [IQlog] [IQgauss] [IQ-Математика]

В данном документе представлен прототип программы, которая вычисляет натуральный логарифм для целого числа. Применен особый стиль написания вычислительного кода с плавающей точкой (IQ-стиль), при соблюдении которого трансляторы генерируют команды целочисленной арифметики. Логарифм вычисляется с помощью полинома наилучшего приближения для аргумента на ограниченном интервале, см. табл. 1. Расширение диапазона аргумента реализовано в алгоритме учётом веса порядка двоичного числа в логарифмическом масштабе.

Таблица 1. Полиномы наилучшего приближения для функции Ln(1 + x)
на интервале аргумента, (1 + x), от 0.5 до 1.0
Полином наилучшего приближения Абсолютная погрешность Число операций
1 x · (0.891 - 0.9472 · x) - 0.0053 0.555e-2 4
2 x · (1.0283 - x · (0.2805 - 0.8715 · x)) + 0.0008 0.735e-3 6

Представим план (идею) алгоритма вычисления логарифма:

1. Поскольку переход к любому новому основанию логарифма связан
   с умножением на константу:
                    lg(x) = lg(e) * ln(x),
   будем вычислять натуральный логарифм.
2. Аргумент для вычисления логарифма – это двоичное целое число,
   которое можно представить в нормализованной форме:
            x = m * 2^n, где m – мантисса, n – порядок.
   Тогда ln(x) = n * ln(2) + ln(m). И требуется вычислить ln(m),
   для аргумента, m, принадлежащего диапазону от 0.5 до 1.0.
3. Пусть y = m - 1. ln(m) = ln(1 + y) = y - y^2 / 2 + y^3 / 3 - ...
   Т.к. аргумент, y, принадлежит небольшому интервалу, от -0.5 до 0,
   ряд можно сократить до двух членов с подобранными коэффициентами.

Программа вычисления натурального логарифма представлена ниже по тексту в листинге 1, см. функцию IQlog. Используются лишь самые быстрые операции целочисленного АЛУ (сдвиг, сложение, умножение). Для использования функции следует определить глобальную константу GL_Q, которая определяет количество разрядов в целом числе отведенных под дробную часть. Если значение константы будет равно нулю, то будут задействованы операции с плавающей точкой.

Чертёж 1

Листинг 1. Программный код dll-блока (javascript)

Отлаженный в модели javascript-код функции IQlog переписывают в соответствии с синтаксисом языка Си. Функции-обертки IQ и IQmpy замещают соответствующими макросами. Необходимо принять во внимание, что предложенный код является лишь прототипом. При решении конкретных задач, аргумент, обычно, оказывается приведенным. Код функции IQlog можно и нужно сокращать.

20.07.2018