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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DmitryM5
Love~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 822
Записей в блоге: 1
#1

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

12.09.2013, 23:57. Просмотров 418. Ответов 8
Метки нет (Все метки)

Задание: Дано вещественное число 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");
    
 
}
Миниатюры
Задача и вывод:(!  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 23:57     Задача и вывод:(!
Посмотрите здесь:

Задача по С++. Ввод-вывод в с++ - C++
Сформировать двоичный файл из элементов, заданной в варианте структуры, распечатать его содержимое, выполнить удаление и добавление...

задача на вывод элементов набора - C++
Дано вещественное число B, целое число N и набор из N вещественных чисел, упорядоченных по возрастанию. Вывести элементы набора вместе с...

Задача на вывод значений функции - C++
Вывести на экран значения функции z=y*{e}^{2-x}-{x}^{2}*{y}^{3} , если x изменяется в диапазоне от 2 до 4 с шагом 0,5, а y изменяется в...

Интересная задача на вывод процентов - C++
Задан текст, слова которого разделены %. Выяснить и вывести на экран, какой процент слов в тексте начинается на заданную букву (буква...

Задача на вывод элементов матрицы по спирали - C++
#include&lt;iostream.h&gt; #include&lt;conio.h&gt; #define n 5 void main() { int k,j,i; int imin,jmin,imax,jmax; int a; jmin=0; ...

Задача на классы. Вывод элемента с заданной харакеристикой - C++
Создать класс для обработки информации о плодах. Сведения о плоде содержат название, размер, цвет. Функции: а) функция ввода информации...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
13.09.2013, 06:16     Задача и вывод:(! #2
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Verh*=(Verh+2);
Здесь неверно же! я не понимаю, зачем тебе возводить Verh практически в квадрат на каждой итерации?!
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
13.09.2013, 09:46     Задача и вывод:(! #3
Цитата Сообщение от DmitryM5 Посмотреть сообщение
-1.#IND
- это бесконечность. И вполне возможно это из-за
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Verh*=(Verh+2);
, так что где-то ты налажал..
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 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
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 822
Записей в блоге: 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
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 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++
Напишите программу, которая запрашивает у пользователя 10 результатов игры в гольф, сохраняя их в массиве. При этом необходимо...

Задача на вывод целочисленного массива размера N,содержащей степени двойки от первой до N - C++
Дано целое число N(N&gt;0).Сформировать и вывести целочисленный массив размера N,содержащей степени двойки от первой до N-й:2,4,8,16.... ...


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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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     Задача и вывод:(!
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru