Предлагаю добавить несколько математических функций:
• void std::sincos(double arg, double& sin, double& cos), std::sincos_t std::sincos(double arg), struct sincos_t { double sin, cos; } (а также sincosf, sincosl) — вычисление синуса и косинуса одной операцией, поскольку зачастую это можно реализовать более быстрым способом, чем последовательное вычисление sin и cos (аналогично как std::div позволяет получить сразу и частное, и остаток). Также будет полезно добавить функции std::apsin, std::apcos, std::apsincos, std::aptan, std::apatan и std::apatan2 для приблизительного вычисления синуса, косинуса, тангенса и арктангенса (во многих случаях точность не так важна, а кол-во итераций при использовании рядов Маклорена, используемых для вычисления тригонометрических функций в SIMD, можно уменьшить).
• double std::invsqrt(double arg) (а также invsqrtf, invsqrtl... или std::arsqrt от слов "approximate reciprocal square root") — приблизительное вычисление обратного квадратного корня (например, в x86 / x86-64 реализуется через SIMD гораздо быстрее, чем вычисление квадратного корня и деления).
• double std::rem(double x, double y) (а также remf, reml) — остаток от деления со знаком делителя (подобное реализовано во многих языках программирования, однако отсутствует в C++).
Примеров применения масса: работа с векторами, графика и пр.
Тесты sincos: https://quick-bench.com/q/4eUkcNZ70coSAcrXZTgruclN7Yw (в SIMD одновременное вычисление может быть осуществлено в 2 раза быстрее, чем последовательное, с использованием 2-х ячеек одного регистра: одной для синуса, другой для косинуса).
Предлагаю добавить несколько математических функций:
•
void std::sincos(double arg, double& sin, double& cos)
,std::sincos_t std::sincos(double arg)
,struct sincos_t { double sin, cos; }
(а также sincosf, sincosl) — вычисление синуса и косинуса одной операцией, поскольку зачастую это можно реализовать более быстрым способом, чем последовательное вычисление sin и cos (аналогично как std::div позволяет получить сразу и частное, и остаток). Также будет полезно добавить функцииstd::apsin
,std::apcos
,std::apsincos
,std::aptan
,std::apatan
иstd::apatan2
для приблизительного вычисления синуса, косинуса, тангенса и арктангенса (во многих случаях точность не так важна, а кол-во итераций при использовании рядов Маклорена, используемых для вычисления тригонометрических функций в SIMD, можно уменьшить).•
double std::invsqrt(double arg)
(а также invsqrtf, invsqrtl... илиstd::arsqrt
от слов "approximate reciprocal square root") — приблизительное вычисление обратного квадратного корня (например, в x86 / x86-64 реализуется через SIMD гораздо быстрее, чем вычисление квадратного корня и деления).•
double std::rem(double x, double y)
(а также remf, reml) — остаток от деления со знаком делителя (подобное реализовано во многих языках программирования, однако отсутствует в C++).Примеров применения масса: работа с векторами, графика и пр.
Тесты
sincos
: https://quick-bench.com/q/4eUkcNZ70coSAcrXZTgruclN7Yw (в SIMD одновременное вычисление может быть осуществлено в 2 раза быстрее, чем последовательное, с использованием 2-х ячеек одного регистра: одной для синуса, другой для косинуса).Тесты
invsqrt
: https://quick-bench.com/q/8_wm4EZ8VLkoQI2hwYPmKd7QDis.