ideas
ideas copied to clipboard
Новые математические функции: std::sincos, std::invsqrt, std::rem.
Предлагаю добавить несколько математических функций:
• 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.
sincos был бы очень полезен, как узнать, идёт ли какое-то обсуждание по этой теме?