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

Поиск:

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


Новичок



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

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



Цитата(borisbn @  6.2.2012,  15:34 Найти цитируемый пост)
лови, экспериментируй...

Спасибо большое) 
но всё равно при больших итерациях стандартный синус быстрее)
PM MAIL   Вверх
borisbn
Дата 6.2.2012, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Staskot @  6.2.2012,  16:03 Найти цитируемый пост)
но всё равно при больших итерациях стандартный синус быстрее)

и у меня на компе и на LWS mysin быстрее
http://liveworkspace.org/code/963cec3c07a8...bb94dd79915c457


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Staskot
Дата 6.2.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(borisbn @  6.2.2012,  16:10 Найти цитируемый пост)
и у меня на компе и на LWS mysin быстрее

насколько сильно время зависит от процессора? у меня на ноуте intel core i3 по 2.27
PM MAIL   Вверх
borisbn
Дата 6.2.2012, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



На моём компе (MSVS 2008)
Цитата

math::sin time is 29 ms
my::sin time is 17 ms
delta is 0.000555748

на LWS
Цитата

math::sin time is 70 ms
my::sin time is 50 ms
delta is 0.000555748


Кста, может ты в Debug-режиме запускаешь ???
Тогда может быть всё, что хочешь. Нужно в Release

Это сообщение отредактировал(а) borisbn - 6.2.2012, 16:33


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Staskot
Дата 6.2.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(borisbn @  6.2.2012,  16:31 Найти цитируемый пост)
Кста, может ты в Debug-режиме запускаешь ???
Тогда может быть всё, что хочешь. Нужно в Release

да в дебаге) чесно говоря первый раз слышу про Release )не подскажешь как через него запускать?

Добавлено через 9 минут и 59 секунд
Всё разобрался что такое Releaseи как через него запускать) всё работает) Спасибо))Теперь для полного счастья мучает вопрос) по заданию мне надо чтоб точность было ровно 10 знаков? возможно ли это?
PM MAIL   Вверх
bsa
Дата 6.2.2012, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Staskot, ровно никогда не говорят. Обычно, "не менее 10 знаков". Это разные вещи. Например, синус 0 равен 0. И ты можешь убиться, но точность будет ограничена особенностями типа double (например, больше 10 знаков). 
Если ты хочешь проверить, то делается это очень просто. Модуль разницы между твоим значением и стандартным должен быть меньше 1.0e-10.

Это сообщение отредактировал(а) bsa - 6.2.2012, 17:18
PM   Вверх
Staskot
Дата 6.2.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @  6.2.2012,  17:18 Найти цитируемый пост)
Модуль разницы между твоим значением и стандартным должен быть меньше 1.0e-10.

Т.е в моем случае это будет выглядеть примерно так??
Код

if (abs(mysin( x ) - sin( x ))< 1.0e-10)
     cout << "good ";
else cout << "bad";

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


Эксперт
****


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

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



Прошу прощения, что я опять со своим C)))

Пользуясь формулой
Цитата
sin( x + dx ) = sin(x) * cos(dx) + cos(x) * sin(dx)

и тем, что cos(dx) ~ 1 и sin(dx) ~ dx при малых dx, можно повысить точность вычисления на несколько порядков, потеряв в скорости...

Получилось так:
Код

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

#define PI 3.14159265358
#define MAX_ANGLE (4*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 )
{
  register int i = (int) (x / PI * (double) MAX_ANGLE);
  return tableSin[i];
}

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

#define N 1000000
#define M 100

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

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

#define GETTIME(f,tm) \
  do{ \
    LARGE_INTEGER time1, time2; \
    double z, span; \
    int n; \
    \
    QueryPerformanceCounter( &time1 ); \
    for( n=0,z=0; n<N; n++, z+=y) (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 SINCHECK

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

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

#ifdef SINCHECK
  {
    int n; double z;
    for( n=0,z=PI-y; n < N; n++, z-=y)
    {
      double m = mysin(z), m2 = mysin2(z), s = sin(z);
      if( fabs( (s-m) ) > 8e-4 ) printf( "Oops(mysin)... z=%g s=%g m=%g err=%g\n", z, s, m, fabs( (s-m) ));
      if( fabs( (s-m2) ) > 3e-7 ) printf( "Oops(mysin2)... z=%g s=%g m=%g err=%g\n", z, s, m2, fabs( (s-m2) ));
    }
  }
#endif

  for( m = 0; m < M; m++)
  {
    GETTIME( mysin, ty);
    GETTIME( mysin2, ty2);
    GETTIME( sin, ts);
  }

  PRITIME( ts, "sin");
  PRITIME( ty, "mysin");
  PRITIME( ty2, "mysin2");
}


Время получается такое:
Цитата

sin time: 88.84 97.85 92.51 ms
mysin time: 52.15 59.52 54.53 ms
mysin2 time: 94.72 105.79 99.33 ms

но, как выяснилось, на него нельзя положиться)))

Это сообщение отредактировал(а) feodorv - 6.2.2012, 21:08


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


Эксперт
****


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

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



Вот результаты LWS: http://liveworkspace.org/code/e981bae92390...f769efa0cac0587

Цитата
sin time: 40.000000 50.000000 43.600000 ms
mysin time: 20.000000 30.000000 23.300000 ms
mysin2 time: 20.000000 40.000000 27.000000 ms


По уму нужно сгенерировать таблицы tableSin etc, а не вычислять на ходу.
Рабочий отрезок 0<=z<PI, следовательно, нужны дополнительные манипуляции с аргументом, чтобы охватить всю числовую прямую, что также займёт время.



Если поиграться со значением константы MAX_ANGLE, то в конце концов можно достигнуть желаемой точности (при MAX_ANGLE=256*1024): http://liveworkspace.org/code/676649223321...7fbdf4b095fb2b6
Цитата

Max error: mysin=1.19834e-05 mysin2=7.18012e-11
sin time: 40.000000 60.000000 44.200000 ms
mysin time: 10.000000 30.000000 22.200000 ms
mysin2 time: 20.000000 40.000000 25.600000 ms


Это сообщение отредактировал(а) feodorv - 6.2.2012, 21:39


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


Новичок



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

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



на моей VS 2010 отказывается почему-то показывать время) по нулям показывает)
PM MAIL   Вверх
feodorv
Дата 6.2.2012, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Staskot @  6.2.2012,  22:58 Найти цитируемый пост)
на моей VS 2010 отказывается почему-то показывать время) по нулям показывает) 

Какой вариант используется? С LWS?


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


Новичок



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

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



Цитата(feodorv @  6.2.2012,  23:08 Найти цитируемый пост)
Какой вариант используется? С LWS? 

да с LWS) через дебаг работает) а через релайз нет)
PM MAIL   Вверх
Staskot
Дата 6.2.2012, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



проблема решилась отключением оптимизации) вроде всё заработало) то что я её отключил сильно на что-нибудь повлияет?)
PM MAIL   Вверх
volatile
Дата 6.2.2012, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Ну да все привально, 
Цитата(volatile @  3.2.2012,  23:48 Найти цитируемый пост)
Единственно, где есть какая-то надежда обогнать math.h,  это табличный синус.

а если его обрамить необходимыми проверками на выход из диапазона.
(кстати вы не пробовали синус отрицательного угла вычислить по вашей таблице  smile)
то выигрыш будет совсем ничтожным. Это притом что для таблицы в 3600 даблов, достигается точность
Цитата(borisbn @  6.2.2012,  16:31 Найти цитируемый пост)
delta is 0.000555748
т.е фактически 3 знака.
значит для 10 знаков точности понадобится таблица в 36000000000 даблов smile 

Цитата(feodorv @  6.2.2012,  23:08 Найти цитируемый пост)
Какой вариант используется? С LWS? 

LWS компилит в дебаговом режиме, если не о шибаюсь, так что проверять там быстродействие не стоит.

Добавлено через 3 минуты и 28 секунд
Цитата(Staskot @  6.2.2012,  23:51 Найти цитируемый пост)
проблема решилась отключением оптимизации) вроде всё заработало) то что я её отключил сильно на что-нибудь повлияет?) 

Можно и еще замедлить стандартный синус.
напишите обертку для него, тогда точно его обгоните  smile 
PM MAIL   Вверх
feodorv
Дата 7.2.2012, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(feodorv @  6.2.2012,  21:03 Найти цитируемый пост)
Рабочий отрезок 0<=z<PI, следовательно, нужны дополнительные манипуляции с аргументом, чтобы охватить всю числовую прямую, что также займёт время.

Цитата(volatile @  6.2.2012,  23:52 Найти цитируемый пост)
а если его обрамить необходимыми проверками на выход из диапазона.

Цитата(volatile @  6.2.2012,  23:52 Найти цитируемый пост)
кстати вы не пробовали синус отрицательного угла вычислить по вашей таблице 

Вот-вот smile 

Цитата(volatile @  6.2.2012,  23:52 Найти цитируемый пост)
Можно и еще замедлить стандартный синус.

Вариант!!!


Цитата(Staskot @  6.2.2012,  23:51 Найти цитируемый пост)
то что я её отключил сильно на что-нибудь повлияет?) 

Да, стоит переписать программу так, чтобы получаемые значения как-то использовались, а то, действительно, компилятор понимает, что они нафик не нужны, вот и не вычисляет...
На LWS используется clock() вместо QueryPerformanceCounter()(((

Цитата(Staskot @  6.2.2012,  23:51 Найти цитируемый пост)
вроде всё заработало)

Какие цифры получились?


Цитата(volatile @  6.2.2012,  23:52 Найти цитируемый пост)
значит для 10 знаков точности понадобится таблица в 36000000000 даблов 

По новому варианту хватает трёх таблиц по 256*1024 элементов)))

Это сообщение отредактировал(а) feodorv - 7.2.2012, 00:13


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

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

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

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

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


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

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


 




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


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

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