Форум программистов, компьютерный форум 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; } подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
27.07.2014, 13:54     Максимально быстрый вариант вычисления sinf/cosf
Я не сильно разбираюсь в алгоритмах, но, думается, смысл задания следующий. Синус и косинус вычисляется через разложение в ряд или что-то типа того. Реализацию в glibc можно посмотреть

https://sourceware.org/git/?p=glibc....sinf.c;hb=HEAD
https://sourceware.org/git/?p=glibc....sinf.c;hb=HEAD

функция sin является как бы обёрткой, которая произвольное значение аргумента сводит к диапазону [0, pi/4] (и отсекает кривые случаи), а функция ksinf уже вычисляет синус для аргумента [0, pi/4]. Внутри ksinf'а есть вычисление ряда. Думается, если из формулы выкинуть хвост, то результат получится менее точный, но зато более быстро вычисляемый

Добавлено через 47 секунд
Тьфу блин, не заметил про таблицу

Добавлено через 3 минуты
Вот есть таблица синусов
http://www.webmath.ru/poleznoe/table_sinus.php
статически заполняешь этими значениями массив данных. Затем, на пальцах, если тебе нужно вычислить синус от нуля градусов, то возвращаешь нулевой элемент таблицы, если синус одного градуса - первый элемент таблицы и т.п. Если нужно вычислить синус от 1.6 градуса, то вычисляешь значение, предполагая, что между 1 и 2 градусами имеем линейную зависимость. При таком раскладе как раз попадёшь в требуемую точность. Ну и надо учесть, что тебе аргумент будет в радианах передаваться, а не в градусах

Добавлено через 6 минут
Цитата Сообщение от MasterOfOrion Посмотреть сообщение
А в чём прикол то ? Функция sinf не устраивает?
"Стандартный" синус вычисляет с точностью до 7 или 8 знака (в десятичной системе) и работает порядка сотен машинных тактов. Для каких-нибудь систем, работающих в реальном времени (например, обрабатывающих данные с локатора или 3d-игрушек) это слишком жирно. Вместо этого можно получить менее точное значение (ибо в определённых классах задач вполне хватает и с точностью до сотых), но в несколько раз быстрее. Для этого и используют таблицы, где все значения заранее вычислены
 
Текущее время: 07:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru