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

Вычислить бесконечное суммирование - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обращение к переменным одного метода из другого внутри класса http://www.cyberforum.ru/cpp-beginners/thread1023678.html
Доброго времени суток. Поставлена задача написать программу реализующую матрицу и поостые арифметические действия, определение детерменанта и решенеие слау 2 способами посредством классов. В одном...
C++ Вывод адреса по указателю на char в std::cout Есть такая вот функция. void Char(char type){ char c,*vc=&c; cout<<setw(8); cin>>c; cout<<type <<setw(8)<<c <<setw(11)<<hex<<c <<setw(20)<<setprecision(3)<<vc<<endl;} Не работает hex,символ... http://www.cyberforum.ru/cpp-beginners/thread1023670.html
C++ Переработать калькулятор в ООП стиль
Помогите преработать калькулятор в ООП стиль. Очень нужно ( СПС #include <iostream.h> #include <conio.h> int main() { int c,a,b,d;
C++ Вывести строки таблицы в заданном виде
Нужно вывести строки таблицы в таком виде 0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5
C++ Подсчет суммы отрицательных элементов массива А(10) http://www.cyberforum.ru/cpp-beginners/thread1023660.html
Помогите решить задачку подсчета суммы отрицательных элементов массива А(10) буду признателен
C++ работа с массивами, процедуры и функции дано такое задание: Ввести двухмерный массив A и одномерный массив B. В конец массива B добавить максимальные элементы всех строк массива A. может кто то помочь решить такую задачу с помощью... подробнее

Показать сообщение отдельно
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
30.11.2013, 19:26
Однако мне показалось, что смысл задачи - возвести число в определённую степень с заданной точностью.
Пока у меня мой код не работает, выкладывать нечего...

Добавлено через 3 часа 19 минут
Нижеприведённый код содержит ошибки вычисления, связанные с тем, что числа в C++ хранятся в двоичном формате,
а не в десятичном и при вычислениях постоянно округляются.
Однако это уже шаг к решению поставленной задачи в том смысле, в котором я её понял.
Т.е. пользователь возводит e в степени с заданной точностью вычисления.
В файл выводятся результаты.
Для более точных результатов, возможно вместо long double использовать строки string (библиотека <string>) или
массивы символов char*. Там надо в начале отсекать всё что до точки, точку, а потом считать число знаков после точки.
Запара!

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// [url]http://www.cyberforum.ru/cpp-beginners/thread1023680.html[/url]
// c++, gcc 4.8.2, linux.
 
#include <iostream> // Стандартный консольный ввод-вывод на(с) экран(а).
#include <cmath> // Математические функции. Можно math.h
#include <fstream> // Файловый ввод-вывод.
#include <stdlib.h> // Для конвертирования.
#include <iomanip> // Округление до заданного значения.
 
using namespace std;
 
int main(int, char**);
long double Y(long double, long double); // e в степени с заданной точностью.
long int Factorial(long int);
 
int main(int argc, char* argv[])
{
    long double z = 1.0;        // Знаяение по умолчанию. Степепь числа.
    long double e = 0.0001;     // Значение по умолчанию. Точность.
    long int ie; // Для рассчёта числа знаков после точки.
    long double Result = 0.0;   // Результат вычисления.
    char szContinue = 'n';      // Желает ли пользователь продолжать.
    long int szN = 0;               // Число повторов ввода чисел.
 
    const char FileName[10] = "file.data"; // Имя файла для выгрузки данных.
 
    cout << "\n\tНаша задача возвести в степень число e с заданной точностью." << endl << endl;
 
    // Открываем файловый поток на вывод данных в файл.
    ofstream szOFS; // Затираем ранее введённые данные.
    szOFS.open(FileName, ios_base::out);
 
    do // Начинаем цикл.
    {
        if ( argc > 2 + 2*szN ) // Если все данные введены в командной строке после имени программы через пробел.
        {
            z = atof(argv[1]);
            e = atof(argv[2]);
        }
        else if ( argc > 1+ 2*szN)
        {
            z = atof(argv[1]);
            cout << "Введите точность, до которой вычислять: ";
            cin >> e;
            // [url]http://www.cyberforum.ru/cpp-beginners/thread692420.html[/url] - Конвертация символов в числа.
        }
        else
        {
            cout << "Введите степерь числа: ";
            cin >> z;
 
            cout << "Введите точность, до которой вычислять: ";
            cin >> e;
        };
        if ( e < 1 )
        {
            ie = log10(e) * (-1);   // Этот метод не точный. Как по другому пока не понял.
            // Проблема в том, что long double - двоичное число, а не десятичное и оно уже изначально округлено.
        }
        else
        {
            ie=0;
        };
//    cout << e << '\t' << ie << endl;
        Result = Y(z, e); // Считаем.
 
        // Выводим на консоль экрана.
        cout
            << "возвели e в степень " << z << ", "
            << "задана точность " << e << ", "
            << setprecision(ie) << Result << endl;
        // Выводим в файл.
        szOFS
             << "возвели e в степень " << z << ", "
             << "задана точность " << e << ", "
             << setprecision(ie) << Result << endl;
 
        cout << "Если хотите продолжить, введите \"y\" или \"Y\" и нажмите \"Enter\": ";
        cin >> szContinue;
        szN++;
    }
    while (szContinue == 'y' || szContinue == 'Y');
 
    // Закрываем файловый поток.
    szOFS.close();
 
    return 0;
}
 
long double Y(long double z, long double e)
{
    long double Result = 1.0;   // Предопределённое значение - Результат.
    long int i = 1.0;               // Счётчик для цикла.
 
    Result = 1.0; // По формуле сначала идёт еденица.
    while ( (pow(z,i)/Factorial(i)) >= e )  // Если условие удовлетворяется,
    {
        Result += pow(z,i)/Factorial(i);  // то добавляем к результату.
        i++;
 
    };
/* // Этот блок только для отладки.
    cout << "возвели e в степень " << z << ", "
         << "задана точность " << e << ", "
         << "знаков после разделителя - " << i-4
         << ", результат = " << setprecision(i-3) << Result << endl << endl; // Почему так, не знаю!
*/
//    cout << '\t' << z << '\t' << e << endl;
 
    return Result;
}
 
long int Factorial(long int x)
{ // [url]http://www.cyberforum.ru/cpp/thread31681.html[/url]
    long double Result = 1.0;   // Предопределённое число. Результат.
 
    if (x == 0 || x == 1)
    {
        Result = 1.0;
    }
    else
    {
        for (long int a = 1; a <= x; a++)
        {
            Result *= a;
        };
    };
 
    return Result;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru