Skip to content

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

@jin-x

Description

@jin-x

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

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    good first issueНесложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions