C/C++

Что требует меньше вычислительной мощности — сигмоида или синус?

sigmoid(x) = 1 / (1 + exp(-x))

VS

sin(x)
Это зависит от конкретных реализаций этих функций. Можно запустить, например, такую программу:
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;
double r()
{
return 1400.-700.*rand()/RAND_MAX;
}
double sigmoid(double x)
{ return 1. / (1. + exp(-x)); }
int main()
{
int n, told, tnew;
double *a = new double[100000000];
told = time(nullptr);
srand(told);
for (n = 0; n < 100000000; n++) a[n] = r();
tnew = time(nullptr);
cout << tnew - told << ' ';
told = tnew;
for (n = 0; n < 100000000; n++) sigmoid(a[n]);
tnew = time(nullptr);
cout << tnew - told << ' ';
for (n = 0; n < 100000000; n++) sin(a[n]);
cout << time(nullptr) - tnew << endl;
return 0;
}
Здесь вычисляются две функции от одинаковых аргументов. У меня на смартпэде массив случайных аргументов формируется 6 секунд, сигмоиды вычисляются 8 секунд, а синусы доли секунды.
Асхат Афанасьев
Асхат Афанасьев
66 572
Лучший ответ
Петраков Павел мне интересны те что используются в оптимизированных библиотеках типа numpy. Огромное спасибо за информацию
Насколько я помню, синус и экспонента реализованы аппаратно в математическом сопроцессоре. Поэтому один май.
Если считать по Тейлору, то синус при схожей точности будет в 2 раза быстрее.
Если будет очень много вычислений, то в твоем случае к экспоненте добавляется время на математические операции (тоже через сопроцессор), и синус будет быстрее раз в 10.
предлагаю взять конкретные реализации сигмоиды с синусом и побенчмаркать
по сути там в обоих случаях будут ряды тейлора плюс какие-то приближения и оптимизации для частных случаев
я бы ставил на то, что экспонента (сигмоида) будет чуть жирнее, т.к. она не периодическая и чуть медленнее сходится
AE
Aaaaa Eeeeee
36 952

Похожие вопросы