Предлагаю добавить несколько математических функций:
• 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-х ячеек одного регистра: одной для синуса, другой для косинуса).
The text was updated successfully, but these errors were encountered:
jin-x
changed the title
Новые математические функции: std::sincos, std::invsqrt (или std::arsqrt), и std::rem.
Новые математические функции: std::sincos, std::invsqrt, std::rem.
Feb 27, 2022
jin-x commentedFeb 27, 2022
•
edited
Предлагаю добавить несколько математических функций:
•
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.The text was updated successfully, but these errors were encountered: