Инструкция FYL2XP1

Мне интересно, почему инструкция FYL2XP1 на архитектуре x86 вычисляет именно математическую формулу y · log2(x + 1).

Что особенного в этой формуле?

2 ответа

Решение

y операндом обычно является постоянная времени компиляции, на данный момент забудьте о x + 1,

поскольку log_b(x) = log_b(2) * log_2(x) инструкция позволяет вычислить логарифм в любой базе x + 1,
Обратите внимание, что log_b(2) является константой, поскольку редко требуется вычислять логарифм со степенью свободы в основании.

FYL2XP1 а также FYL2X единственные две инструкции x87, которые вычисляют логарифм
Если бы логарифм был алгебраической функцией, то одной инструкции было бы достаточно, но, поскольку она трансцендентна, Intel дала две версии.

FYL2X работает на полной области логарифма, но он не совсем точен в этом полном диапазоне, особенно для очень малых значений x (вероятно, медленнее, я думаю, что нужно уменьшить диапазон, использовать усеченное расширение Тейлора или приближение Паде, а затем повысить точность с помощью поиска в таблице).

FYL2XP1 вместо этого работает только для ввода в малом диапазоне ±( 1 - sqrt(2) ⁄ 2).
Это должно быть быстрее (без уменьшения диапазона) и, что более важно, для данного входного диапазона используемый метод аппроксимации должен иметь точность, равную или превышающую 80-битную точность с плавающей запятой x87.

Эта инструкция обеспечивает оптимальную точность для значений epsilon [значения в регистре ST(0)], близких к 0. Для небольших значений epsilon (ε) более значимые цифры можно сохранить с помощью инструкции FYL2XP1, чем с помощью (ε+1) в качестве аргумента инструкции FYL2X.

@ Mysticial - это комментарий к:
Алгоритм, используемый FYL2X после всех других необходимых шагов, вероятно, использует формулу аппроксимации для log(x + 1),
Чтобы преобразовать это в формулу для log(x) вход должен быть вычтен один. x - 1 операция потеряет точность, если x очень мала (потому что большая разница в показателях двух чисел сместит большую часть xцифры справа).
FYL2XP1 не буду делать x - 1 и не потеряет точность.

Насколько я знаю, общее описание этой команды содержит неточность. Исторически эта команда работала не в диапазоне ±(1 – sqrt(2) ⁄ 2 ), а в диапазоне sqrt(2) ⁄ 2 – 1 <= x <= sqrt(2) – 1. Это диапазон приближения этой функции полиномом. Это было именно так, потому что тогда левая и правая границы диапазона для аргумента логарифма (x+1) отличаются в 2 раза, что позволяет относительно легко распространить результат этой функции на любой x>-1. Важно отметить, что во всех современных процессорах команда fyl2xp1 поддерживает любое значение x > -1, и эту возможность можно смело использовать. Но нужно помнить, что эта команда не выбрасывает исключение в случае ошибочного аргумента.

Другие вопросы по тегам