Форум программистов, компьютерный форум CyberForum.ru

Максимально быстрый вариант вычисления sinf/cosf - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Простое создание строки из объектов разных типов данных http://www.cyberforum.ru/cpp-beginners/thread1234710.html
Всем доброго времени суток. Создал класс, который (по моему мнению) сделает более удобным создание строк и их передачу в функции, принимающие строки. Посоветуйте, как можно (если нужно) его улучшить. Пример использования string num = mkstr() << 15 //число в строку //передача строки в функцию int a = rand()%100 ofstream fout(mkstr() << "file" << a << ".txt"); Исходный код
C++ Правильно ли в приведенном примере реализовано выделение и очищение памяти под двумерный вектор Скажите правильно ли я выделяю и очищаю память под двухмерный вектор class A { private: std::vector< std::vector<int> >* vec; public: A() http://www.cyberforum.ru/cpp-beginners/thread1234703.html
C++ Циклы: вычисление синуса
Приступил к циклам. Задание такое: Как известно, функция sin(x) может может быть вычислена в виде ряда sin(x)=x-x^3/3!+x^5/5!-...=\sum_{n=0}^{\propto }(-1)^n*(x^(2n+1))/(2n+1)! На практике при вычислении значения функции sin(x) соответствующий ряд ограничивают, т.е. рассматривают приближенное выражение sin(x)= x-x^3/3!+x^5/5!-x^7/7!+...+...
Boost::regex не могу сформировать ссылку на паттерн при поиске C++
Необходимо найти 2 повторяющихся заголовка и объединить некоторое содержимое через replace. Хотел создать выражение для поиска: ^(prefix=)(.*)(\n)(*)($2) Вот только ссылка $2 не возвращает содержимое (.*). Можно как-то сделать подобную ссылку? Спасибо.
C++ Инициализация переменных - некорректно работает пример из книги http://www.cyberforum.ru/cpp-beginners/thread1234669.html
Взял задачку из книги Г.Шилда. Должно показывать 1 3 6 10 15. Но у меня выдает 1 2 3 4 5. Набрал всё точь в точь с книги, в чём проблема, кто подскажет? #include <iostream> #include <conio.h> using namespace std; void total (int x); int main(){ setlocale(LC_ALL,"RUS"); cout << "Вычисление суммы чисел от 1 до 5.\n"; total(5); _getch();
C++ Не работает цикл for #include <iostream> #include <conio.h> using namespace std; int main() { int x; for(x=0; x<10; x++); cout << x << " "; _getch(); return 0; } подробнее

Показать сообщение отдельно
VTsaregorodtsev
329 / 309 / 45
Регистрация: 19.02.2010
Сообщений: 1,321
03.08.2014, 21:44     Максимально быстрый вариант вычисления sinf/cosf
Цитата Сообщение от Evg Посмотреть сообщение
Чисто на всякий случай. Если программа короткая, то она совсем необязательно работает быстро. Программа из одной аппаратной операции fsin будет работать 200 тактов
Лезем в оффтопик (для сишного раздела форума) - ну да ладно.
Не 200 - а порядка 100 (если не брать огрызки типа Атомов). В общем, у Агнера Фога в мануале по проц.командам хорошо расписаны растактовки для кучи процессоров.
Во вторых - я и не утверждал, что короткая прога всегда будет более быстрой. Просто при таблицах - будет как минимум одно деление (тоже времязатратная команда), и если этап с делениями ещё и можно будет векторизовать - то потом по таблице всё равно для каждого индекса придётся бегать по-отдельности (тут могу и ошибаться - может, где-нить в SSE4 и есть нужная команда, но в таком случае рискуем потерять портируемость на вполне ещё пригодные для работы компутеры с процами на пару поколений назад).
Просто син-кос - довольно скользкий для оптимизации пример (макс. выигрыш - ну, будет ускорение в разы, а вокруг ускоренного фрагмента же лежит неускоренная остальная программа, и весь выигрыш может замаскироваться (ну, будет прога работать 99 сек вместо 100 - толку от этого?)). Вот если бы была exp() - там да, её можно аппроксимировать и векторизовать всего несколькими командами, и ничего сложнее умножения при этом не будет (рецепт опубликован буржуинами в статьях 1999 и 2008годов, у меня работает - но никому подробности не расскажу, ибо ускорение выходит во многие десятки раз, и ноу-хау поэтому пусть остаётся скрытым для ширнармасс). Таблиц при аппроксимации exp() в данном случае нет, аппроксимация тоже идёт не через приближение полиномами (или чем-то иным) - а совсем на иной идее.

Ну и топикстартеру. Может, стоит переделать алгоритм/задачу так, чтобы синус-косинус не вычислять. Вернее, чтобы взамен аргумента этих функций получались сразу индексы в таблице. Т.е., например, получались углы в градусах. И хорошо, если они будут получаться в виде целых значений - чтобы затем не округлять, а то округление плавучки тоже бывает тормозным: я, например, при работе с компилятором от Борланда/Ембаркадеро в критических местах в явную вписываю вызов своей собственной функции FtoI(val) вместо округления через приведение типа, т.е. через (int)val - а то Борланд реализует приведение типа (и округление) через вызов дольше работающей функции с именем ftol или где-то рядом.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru