Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sin быстрее чем из math.h 
:(
    Опции темы
Staskot
Дата 7.2.2012, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 3.2.2012

Репутация: нет
Всего: нет




Цитата(feodorv @  7.2.2012,  00:07 Найти цитируемый пост)
Какие цифры получились?

Вот что у меня получилось:
Max error: mysin=1.19834e-05 mysin2=7.18012e-11
sin time: 31.000000 50.000000 33.700000 ms
mysin time: 10.000000 17.000000 11.480000 ms
mysin2 time: 15.000000 28.000000 17.030000 ms

PM MAIL   Вверх
feodorv
Дата 7.2.2012, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Staskot @  7.2.2012,  00:19 Найти цитируемый пост)
Вот что у меня получилось:

Супер! Время меньше, ошибка правильная, осталось с диапазоном аргументов разобраться))))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Staskot
Дата 7.2.2012, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 3.2.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  7.2.2012,  00:33 Найти цитируемый пост)
Супер! Время меньше, ошибка правильная, осталось с диапазоном аргументов разобраться)))) 

да всё разобрался с диапазоном) Спасибо большое)

Добавлено через 3 минуты и 26 секунд
А может кто нибудь поделиться ссылками как так же оптимизировать другие функции) ну например exp 
 smile 
PM MAIL   Вверх
feodorv
Дата 7.2.2012, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Staskot @  7.2.2012,  00:48 Найти цитируемый пост)
да всё разобрался с диапазоном)

Не поделишься рецептом?)))

Попробуй вот так с оптимизацией (сократил N с 1000000 до 100000))):
Код

#include <windows.h>
#include <math.h>

#define PI 3.14159265358
#define MAX_ANGLE (256*1024)

static double tableVal[MAX_ANGLE];
static double tableSin[MAX_ANGLE];
static double tableCos[MAX_ANGLE];

void initTables()
{
  int i;

  for( i = 0; i < MAX_ANGLE; i++)
  {
    tableVal[i] = (double) i / (double) MAX_ANGLE * PI;
    tableSin[i] = sin( tableVal[i] );
    tableCos[i] = cos( tableVal[i] );
  }
}

double mysin( double x )
{
  return tableSin[ (int) (x / PI * (double) MAX_ANGLE) ];
}

double mysin2( double x )
{
  register int i = (int) (x / PI * (double) MAX_ANGLE);
  return tableSin[i] + (x - tableVal[i]) * tableCos[i];
}

#define N 100000
#define M 100

enum
{
  SINMIN = 0,
  SINMAX,
  SINAVE,
  SINLAST
};

#define INITIME(tm) \
    (tm)[SINMAX] = (tm)[SINMIN] = (tm)[SINAVE] = 0

#define GETTIME(f,tm,r) \
  do{ \
    LARGE_INTEGER time1, time2; \
    double z, span; \
    int n; \
    \
    QueryPerformanceCounter( &time1 ); \
    for( n=0,z=0; n<N; n++, z+=y) (r)[n] = (f)(z); \
    QueryPerformanceCounter( &time2 ); \
    \
    time2.QuadPart -= time1.QuadPart; \
    span = (double) time2.QuadPart / freq.QuadPart; \
    \
    if( (tm)[SINMAX] < span ) (tm)[SINMAX] = span; \
    if( (tm)[SINMIN] == 0 || (tm)[SINMIN] > span ) (tm)[SINMIN] = span; \
    (tm)[SINAVE] += span; \
  } while(0)

#define PRITIME(tm,fn) \
  printf( "%s time: %.2f %.2f %.2f ms\n", (fn), (tm)[SINMIN]*1000., (tm)[SINMAX]*1000., (tm)[SINAVE] / (double) M * 1000.);

#define CHERROR(e,r) \
  do{ \
    int n; \
    for( n = 0; n < N; ++n) \
      if( fabs(rs[n]-(r)[n]) > (e) ) (e) = fabs(rs[n]-(r)[n]); \
  } while(0)

double rs[N], ry[N], ry2[N];

void main(void)
{
  int m;
  double y;
  LARGE_INTEGER freq;
  double ts[SINLAST], ty[SINLAST], ty2[SINLAST];
  double err, err2;

  y = PI / (double) N;
  QueryPerformanceFrequency(&freq);
  err = err2 = 0;
  INITIME( ts );
  INITIME( ty );
  INITIME( ty2 );
  initTables();

  for( m = 0; m < M; ++m)
  {
    GETTIME( mysin, ty, ry);
    GETTIME( mysin2, ty2, ry2);
    GETTIME( sin, ts, rs);
    CHERROR( err, ry);
    CHERROR( err2, ry2);
  }

  printf( "Max error: mysin=%g mysin2=%g\n", err, err2);
  PRITIME( ts, "sin");
  PRITIME( ty, "mysin");
  PRITIME( ty2, "mysin2");
}


Добавлено через 1 минуту и 18 секунд
Цитата(Staskot @  7.2.2012,  00:48 Найти цитируемый пост)
А может кто нибудь поделиться ссылками как так же оптимизировать другие функции) ну например exp 

The show must go on smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Staskot
Дата 7.2.2012, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 3.2.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  7.2.2012,  01:02 Найти цитируемый пост)
Попробуй вот так с оптимизацией (сократил N с 1000000 до 100000))):

Время не сильно отличается от прошлой программы) Но зато работает с оптимизацией ) большое спасибо) пойду попробую exp написать)

Добавлено через 13 минут и 42 секунды
Цитата(feodorv @  7.2.2012,  01:02 Найти цитируемый пост)
Не поделишься рецептом?)))

ахаха с диапазоном приврал) реально проблемы с ним возникают) 
PM MAIL   Вверх
Staskot
Дата 14.2.2012, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 3.2.2012

Репутация: нет
Всего: нет



Извиняюсь за некромантию) но все же интересно переписал код под косинус) но при точности в 8 знаков теряется выыгрыш в скорости у стандартного) чёт не соображу ни как)
Код

#include <math.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#define PI 3.14159265358
#define MAX_ANGLE (128*1024)

static double tableVal[MAX_ANGLE];
static double tableSin[MAX_ANGLE];
static double tableCos[MAX_ANGLE];

void initTables()
{
  int i;

  for( i = 0; i < MAX_ANGLE; i++)
  {
    tableVal[i] = (double) i / (double) MAX_ANGLE * PI;
    tableSin[i] = sin( tableVal[i] );
    tableCos[i] = cos( tableVal[i] );
  }
}

double mycos( double x )
{
  return tableCos[(int) (x / PI * (double) MAX_ANGLE)];
}

double mycos2( double x )
{
  register int i = (int) (x / PI * (double) MAX_ANGLE);
  return tableCos[i] + (x - tableVal[i]) * tableSin[i];
}

#define N 1000000
#define M 100

enum
{
  COSMIN = 0,
  COSMAX,
  COSAVE,
  COSLAST
};

#define INITIME(tm) \
    (tm)[COSMAX] = (tm)[COSMIN] = (tm)[COSAVE] = 0

#define GETTIME(f,tm) \
  do{ \
    double time1, time2; \
    double z, span; \
    int n; \
    \
    time1 = (double) clock(); \
    for( n=0,z=0; n<N; n++, z+=y) span = (f)(z); \
    time2 = (double) clock(); \
    \
    span = (time2 - time1) / CLOCKS_PER_SEC; \
    \
    if( (tm)[COSMAX] < span ) (tm)[COSMAX] = span; \
    if( (tm)[COSMIN] == 0 || (tm)[COSMIN] > span ) (tm)[COSMIN] = span; \
    (tm)[COSAVE] += span; \
  } while(0)

#define PRITIME(tm,fn) \
  printf( "%s time: %f %f %f ms\n", (fn), (tm)[COSMIN]*1000., (tm)[COSMAX]*1000., (tm)[COSAVE] / (double) M * 1000.);

#define SINCHECK

int main(void)
{
  int m;
  double y;
  double ts[COSLAST], ty[COSLAST], ty2[COSLAST];

  y = PI / (double) N;
  
  INITIME( ts );
  INITIME( ty );
  INITIME( ty2 );
  initTables();

#ifdef SINCHECK
  {
    int n; double z, e = 0., e2 = 0.;
    for( n=0,z=PI-y; n < N; n++, z-=y)
    {
      double m = mycos(z), m2 = mycos2(z), s = cos(z);
      if( fabs(s-m) > e ) e = fabs(s-m);
      if( fabs(s-m2) > e2 ) e2 = fabs(s-m2);
    }
    printf( "Max error: mycos=%g mycos2=%g\n", e, e2);
  }
#endif

  for( m = 0; m < M; m++)
  {
    GETTIME( mycos, ty);
    GETTIME( mycos2, ty2);
    GETTIME( cos, ts);
   
  }
  PRITIME( ts, "cos");
  PRITIME( ty, "mycos");
  PRITIME( ty2, "mycos2");
  getch();
  return 0;
}

PM MAIL   Вверх
feodorv
Дата 14.2.2012, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Staskot @  14.2.2012,  11:25 Найти цитируемый пост)
переписал код под косинус) но при точности в 8 знаков

Какие 8 знаков??? Вы с тригонометрией знакомы???

Цитата(Staskot @  14.2.2012,  11:25 Найти цитируемый пост)
  return tableCos[i] + (x - tableVal[i]) * tableSin[i];

Для cos - совершенно неправильная конструкция(((

Цитата(Staskot @  14.2.2012,  11:25 Найти цитируемый пост)
теряется выыгрыш в скорости у стандартного)

Даже в таком неверном варианте (ошибка mycos2 больше ошибки mycos!!!) считается быстрее (чуть-чуть).

В любом случае, держать в памяти от 3 до 6 мег таблиц - это безумие. Задача была интересна принципиально, но как прикладной вариант никуда не годится.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Staskot
Дата 14.2.2012, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 3.2.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  14.2.2012,  12:19 Найти цитируемый пост)
Для cos - совершенно неправильная конструкция(((

а какая дожна быть формула?
PM MAIL   Вверх
feodorv
Дата 15.2.2012, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Staskot @  14.2.2012,  23:11 Найти цитируемый пост)
а какая дожна быть формула? 

Предлагаю вывести её самостоятельно  smile 
Намёк здесь)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Staskot
Дата 15.2.2012, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 3.2.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  15.2.2012,  17:48 Найти цитируемый пост)
Намёк здесь))) 

ну дык там же просто заменить + на - и все)

Добавлено через 2 минуты и 58 секунд
Цитата

cos (x + dx) = cos x · cos dx − sin x · sin dx

вот эта формула для косинуса)
Цитата(Staskot @  15.2.2012,  23:07 Найти цитируемый пост)
ну дык там же просто заменить + на - и все) 

ну эт у меня в коде)
PM MAIL   Вверх
feodorv
Дата 16.2.2012, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Staskot @  15.2.2012,  23:07 Найти цитируемый пост)
ну дык там же просто заменить + на - и все)

 smile 

Цитата(Staskot @  15.2.2012,  23:07 Найти цитируемый пост)
ну эт у меня в коде) 

В том, который приведён, стоит плюс smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.