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

Задача и вывод:(! - C++

Восстановить пароль Регистрация
 
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 743
Записей в блоге: 1
12.09.2013, 23:57     Задача и вывод:(! #1
Задание: Дано вещественное число X (|X| < 1) и целое число N (> 0). Найти значение выражения
1 + X/2 − 1·X2/(2·4) + 1·3·X3/(2·4·6) − … + (−1)N−1·1·3·…·(2·N−3)·XN/(2·4·…·(2·N)).

Полученное число является приближенным значением функции (1+X)1/2. Проверьте, что значение суммы для достаточно больших N близко к значению этой функции.
Указание: в теле функции не использовать стандартную функцию возведения в степень.


Собственно вопросы:
1.Что такое в выводе -1.#IND
2.Программа при небольших N проходит проверку степени (1+X)^(1/2),но при больших N выводит -1.#IND .
Если рассуждать чем больше N,тем проверка должна же быть точнее.
3.Проверьте код,если не сложно.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <locale>
#include <math.h>
 
using namespace std;
 
double func(double X,int N) {
    double F=1,Verh=1,Niz=2;
    double X2=X;
    int ZN=1;
    F+=X/2;
    for (int i =2;i<=N;i++) {
        ZN*=-1;
        X*=X2;
        Niz*=(Niz+2);
        F+=((Verh*X)/Niz)*ZN;
        Verh*=(Verh+2);
        
    }
    return F;
 
}
 
int main() {
    std::locale::global(std::locale(""));
    double X;
    int N;
    cout<<"Введите вещественное X (|X|<1) и целое N "<<endl;
    cin>>X>>N;
    cout<<"Значение выражения "<<func(X,N)<<endl;
    cout<<"Проверка (X+1)^1/2=  "<<sqrt(1+X)<<endl;
    system("pause");
    
 
}
Миниатюры
Задача и вывод:(!  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.09.2013, 06:16     Задача и вывод:(! #2
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Verh*=(Verh+2);
Здесь неверно же! я не понимаю, зачем тебе возводить Verh практически в квадрат на каждой итерации?!
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
13.09.2013, 09:46     Задача и вывод:(! #3
Цитата Сообщение от DmitryM5 Посмотреть сообщение
-1.#IND
- это бесконечность. И вполне возможно это из-за
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Verh*=(Verh+2);
, так что где-то ты налажал..
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
13.09.2013, 10:18     Задача и вывод:(! #4
DmitryM5, может стоит немного изменить алгоритм? Например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double func(
            double X, //Аргумент ф-и
            int N     //Число членов разложения
            )
{
    double _x = X/2;            //Усеченный аргумент, что бы не вычислять каждый раз в цикле
    double cSecond = _x;        //Первое слагаемое x/2
    double Sum = 1 + cSecond;   //Сумма 1 + x/2
    for(int j = 2; j <= N; j++) //Цикл по всем слагаемым начиная со второго 
    {
        cSecond  *= - (2.0 - 3.0/j) * _x;
        Sum += cSecond;
    }
    return Sum;
}
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
13.09.2013, 13:23     Задача и вывод:(! #5
Цитата Сообщение от Ilot Посмотреть сообщение
cSecond *= - (2.0 - 3.0/j) * _x;
Что это вообще за ересь? На ряд Тейлора совсем не похоже, и к данной функции не относится совершенно...
Так правильнее(точнее - правильно):
C++
1
2
3
4
5
6
double cur = 1;
double sum = cur;
for(int i=1; i<=N; ++i) {
   cur *= -(N*2-3)*x/(N*2); //текущий эл-т ряда.
   sum += cur; //сам ряд.
}
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
13.09.2013, 13:36     Задача и вывод:(! #6
Цитата Сообщение от monolit Посмотреть сообщение
Что это вообще за ересь? На ряд тейлора совсем не похоже - чет вы путаете...
Прежде чем такое писать я бы рекомендовал разобраться, что люди пишут. Вы хотя бы запускали мой код? Он работает не правильно?
Ваш код содержит на две операции больше чем мой. А теперь обратим внимание что это выражение стоит в цикле. Итого ваш код работает дольше.
C++
1
2
   cur *= -(N*2-3)*x/(N*2); //6 арифметических действий
   cSecond  *= - (2.0 - 3.0/j) * _x;//4 арифмитических действия
Не знаю что у вас но это точно не тейлор. Мне кажется вы попутали N и i в цикле.
C++
1
2
3
4
for(int i=1; i<=N; ++i) {
   cur *= -(N*2-3)*x/(N*2); //текущий эл-т ряда.
   sum += cur; //сам ряд.
}
Ах да и рекомендую подтянуть элементарную математику.
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 743
Записей в блоге: 1
13.09.2013, 18:47  [ТС]     Задача и вывод:(! #7
Цитата Сообщение от Ilot Посмотреть сообщение
Прежде чем такое писать я бы рекомендовал разобраться, что люди пишут. Вы хотя бы запускали мой код? Он работает не правильно?
Ваш код содержит на две операции больше чем мой. А теперь обратим внимание что это выражение стоит в цикле. Итого ваш код работает дольше.
C++
1
2
   cur *= -(N*2-3)*x/(N*2); //6 арифметических действий
   cSecond  *= - (2.0 - 3.0/j) * _x;//4 арифмитических действия
Не знаю что у вас но это точно не тейлор. Мне кажется вы попутали N и i в цикле.
C++
1
2
3
4
for(int i=1; i<=N; ++i) {
   cur *= -(N*2-3)*x/(N*2); //текущий эл-т ряда.
   sum += cur; //сам ряд.
}
Ах да и рекомендую подтянуть элементарную математику.
К сожалению ваш код мне не понятен
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
13.09.2013, 23:28     Задача и вывод:(! #8
Цитата Сообщение от Ilot Посмотреть сообщение
Не знаю что у вас но это точно не тейлор. Мне кажется вы попутали N и i в цикле.
Не знаю, как эти два вопроса связаны, но про индекс вы, конечно, правы - опечатался.
это точно не тейлор
Возьмите бумажку, и посчитайте первые три его члена. Разложение указанной функции в ряд Тейлора в точке 0. Конечно, конечной суммой, но точность на совести пользователя остается...
Ряды, стоит заметить, к элементарной математике не относятся.

Цитата Сообщение от Ilot Посмотреть сообщение
cur *= -(N*2-3)*x/(N*2); //6 арифметических действий
* *cSecond **= - (2.0 - 3.0/j) * _x;//4 арифмитических действия
А тут 1 арифметическое действие, то это не значит, что оно лучше.
C++
1
cSecond **=  _x;
Кстати, а где вы указанную схему взяли, где 4 действия? Как она с корнем связана то? Я если честно вообще не пойму, что это такое.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 09:44     Задача и вывод:(!
Еще ссылки по теме:

C++ Задача по функциям (сохранение данных в массиве, вывод, среднее значение)
C++ Интересная задача на вывод процентов
Задача на вывод значений функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
16.09.2013, 09:44     Задача и вывод:(! #9
Цитата Сообщение от DmitryM5 Посмотреть сообщение
К сожалению ваш код мне не понятен
Да просто разделите x на 2, что бы не выполнять эту операцию каждый раз цикле и упростите (N*2-3)/N) = (2 - 3/N). Что тут непонятного?
_x = x / 2;
C++
1
2
(2 * N - 3) * x / (2 * N ) // 5 операций
= (2 - 3/N) * _x // 3 операции
Добавлено через 10 минут
А если ввести две константы c1 = 2 * _x c2 = 3 * _x тогда вообще останется две операции.
Yandex
Объявления
16.09.2013, 09:44     Задача и вывод:(!
Ответ Создать тему
Опции темы

Текущее время: 19:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru