![]() |
|
Модераторы: bsa |
![]()
|
|
| Staskot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.2.2012 Репутация: нет Всего: нет |
ребят, вообщем мне задали написать программу которая считала синус быстрее чем из math.h ) скорость должна достигаться путем потери точности) Я вот написал код который(как я думаю должен быстрее работать) но на деле не вижу что он быстрее) подтолкните кто нить)
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Здесь ты изменяешь шаг аргумента функции sin, да и то, по-моему, неправильно. Функция sin всё равно вызывается N раз. И (самое главное) тебе ж сказали а ты берёшь функцию sin из этого самого math.h Короче, тебе нужно написать свою функцию вычисления синуса. Погугли "разложение синуса в ряд с заданной точностью". Ну или что-то в этом роде. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Фантом |
|
||||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 4 Всего: 49 |
А более точной формулировки задания нет? А то ведь можно написать
и это будет быстро и с абсолютной погрешностью не больше единицы. |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Фантом, у тебя погрешность м.б. больше единицы, т.к. ты преобразуешь double в float (return 0.0;)
Надо
прикалываюсь, ессно -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 4 Всего: 49 |
||||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Гм. Приведённый код считает производительность стандартной функции sin, но нет даже намёка на собственную -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Единственно, где есть какая-то надежда обогнать math.h, это табличный синус.
Да и то я сомневаюсь, что получится обогнать. Там синус вычисляет мат.сопроцессор. вычисление синуса - его внутренняя комманда. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Вот здесь, по-моему, просили вычислить синус с заданной точностью...
Если точность невысока (относительная ~10-4), то может и обогнать... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Набросал некоторую программку:
Здесь mysin использует первые 3 члена разложения sin в ряд, mysin2 - уже 4, mysin3 - практически то же самое, что и mysin2, но несколько иначе считает сумму. Результаты. С установленной SINCHECK:
С выключенной SINCHECK:
Гм. Почему так разнятся результаты (а это поведение устойчивое) с SINCHECK и без оной, понять не могу. В любом случае mysin подходит под условие задачи, причём её точность в диапазоне аргументов -1 <= z <= 1 составляет две сотых процента, а в диапазоне -2 <= z <=2 - полтора процента (этот диапазон не покрывает -pi <= z <= pi, но это другая история). -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Где-то я слышал, что обычно вычисляют синус приближением многочленами Чебышева. FPU по-моему так и делает. Но в нём многочлены взяты такого порядка, чтобы получить расширенную точность (максимальная точность FPU). А вам надо взять степень меньше.
Если найдете материалы по этой теме, киньте ссылку здесь. Мне тоже интересно. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Короче говоря, вместо
Тогда цифры получаются такие:
То есть, в диапазоне -2 <= z <=2 точность достигает трёх процентов (не полутора). Ну это так, для порядка))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| Staskot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.2.2012 Репутация: нет Всего: нет |
feodorv
хм запустил вашу у программу у себя( VS 2010) вот какие у меня результаты: sin time: 0.002971 0.005865 0.003412 seconds mysin time : 0.006127 0.013735 0.007204 seconds mysin2 time : 0.007505 0.013541 0.008607 seconds mysin3 time : 0.008309 0.016118 0.009687 seconds И ещё я правильно понял что добиться скорости в 50% нельзя если обрезать до 10 знаков? |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
По поводу многочленов Чебышева:Добавлено @ 15:56
Можно как раз попробовать Чебышевкий вариант))) А обрезано и так до невозможности... Если у Вас очень малые z (порядка 10-6), то можно просто возвращать z, не заморачиваясь, абсолютная точность до 10 знаков будет обеспечена. Скорость при этом будет обалденная))) Я так и не понял, в каком место вам нужны эти 10 знаков. Чтобы совпадало с точностью до 10 знаков на диапазоне -2 <= z <= 2 никак встроенный sin не обогнать. Добавлено @ 15:58 Но у Вас sin более чем в два раза опережает mysin Это сообщение отредактировал(а) feodorv - 4.2.2012, 16:08 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |