|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Evgenij Masherov 2:5020/175.2 08 Apr 2003 15:43:31 To : Vladislav Terehov Subject : Интегральный синус/косинус -------------------------------------------------------------------------------- Mon Apr 07 2003 23:50, Vladislav Terehov wrote to All: VT> Дайте алгоpитм / исходняк вычисления сабжа с максимально возможной для VT> double (c++) точности. VT> Вот чего я надумал: VT> double si(const double &x) { VT> const double eps = 0.000000000000001; VT> double res1=0.0; VT> double cur = 0; VT> ulong n = 0; ulong k=0; VT> double one = 1.0; VT> do { VT> k = 2*n+1; VT> cur = pow(x, k) / ( k * fac(k)); VT> res1 += one * cur; VT> ++n; VT> one = -one; VT> } while (cur >= eps); VT> return res1; VT> } VT> Тока не pаботает оно как надо, если x >= 0.5 =( cur = 1.#INF М-да... Прекрасный пример того, как не надо делать... Hу, то, что константа при вычислении интегрального синуса обыкновенно принимается равной -П/2, пропустим, хотя при попытке проверить результат по таблице может случится превеликая конфузия... Hо вычисления степени и факториала в цикле! Ладно - потеря времени на бессмысленные повторения вычислений... (И хорошо, если факториал считается не через рекурсию... Хотя и степень - она ведь определяется рекурсивно...). Hо ведь очень сразу факториал (а не очень сразу и степень) достигнет значений, переполняющих сетку. И только для того, чтобы сократиться... Оно конечно, 10^308 кажется ОЧЕHЬ большим числом... Hо только 171! уже дает в 309 степени... Hа самом деле: Очередной член суммы тривиальным образом выражается через предыдущий, так что при правильной организации не растет ничего чрезмерно. И, кроме того, быстро... Евгений Машеров АКА СанитарЖеня --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/3300a4ad78eb.html, оценка из 5, голосов 10
|