cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Новые математические функции: std::sincos, std::invsqrt, std::rem. #513

Open jin-x opened 2 years ago

jin-x commented 2 years ago

Предлагаю добавить несколько математических функций:

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.

1vanK commented 1 year ago

sincos был бы очень полезен, как узнать, идёт ли какое-то обсуждание по этой теме?