Что является более эффективным для синусов и косинусов? Грех и Кос или Грех и Квартал?

К сожалению, стандартная библиотека C ++ не имеет ни одного вызова для sincos, что дает место для этого вопроса.

Первый вопрос:

Если я хочу вычислить sin и cos, дешевле ли рассчитать sin и cos или вычислить sin, тогда как sqrt (1-sin ^ 2) получить cos?

Второй вопрос:

Библиотека ядра Intel Math предоставляет очень хорошие функции для вычислений стандартных математических функций, поэтому существует функция vdSinCos (), которая решает проблему очень оптимизированным способом, но компилятор Intel не является бесплатным. Существует ли какая-либо библиотека с открытым исходным кодом (C, C ++, Fortran), доступная в дистрибутивах Linux, в которой есть те функции, где я могу просто ссылаться на них и иметь оптимальные реализации?

Примечание: я не хотел бы вдаваться в вызовы инструкций, так как они поддерживаются не всеми процессорами. Я хотел бы добавить ссылку на общую библиотеку, которая бы выполняла эту работу за меня на любом процессоре.

Благодарю.

3

Решение

Библиотека GNU C имеет функция sincos (), который воспользуется инструкцией «FSINCOS», которая есть в большинстве современных наборов команд. Я бы сказал, что это ваша лучшая ставка; это должно быть так же быстро, как метод библиотеки Intel.

Если вы этого не сделаете, я бы пошел по маршруту «sqrt (1-sin (x) ^ 2)». В каждом документе по архитектуре процессора, который я рассмотрел, инструкция FSQRT значительно быстрее, чем функция FSIN.

5

Другие решения

Ответ почти на каждую проблему с производительностью — «почему бы вам не измерить это в своем коде», потому что существует большое количество различных факторов, которые влияют на производительность почти любого вычисления, подобного этому. Например, «Кто производит математические функции». Квадратный корень относительно прост для вычисления, но я не уверен, что это огромная разница между sqrt(1-sin*sin) и расчет cos снова. Какой процессор также может быть фактором, и какие другие вычисления выполняются «вокруг» расчетов sin / cos.

Я бы не удивился, если бы где-нибудь была библиотека с такой функцией, но я не искал.

1

Если точность не критична, самый быстрый способ получить грех или cos — это использовать таблицы.
Держите некоторый глобальный константный массив со значениями sin и cos для всех agles с необходимым шагом. Таким образом, ваша функция sin / cos просто должна привести угол к индексу, и вы получите результат.

0
По вопросам рекламы [email protected]