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

Возможная пробелами с типами данных - C++

Восстановить пароль Регистрация
 
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 82
07.10.2013, 20:04     Возможная пробелами с типами данных #1
Здравствуйте!

Есть следующие задание:
http://s5.hostingkartinok.com/upload...7477d9619b.png

Её я решил, вот получившийся код (на код в комментариях не обращайте внимание, сделал 2 варианта, потому что парень которому помогал еще не учил рекурсию и дополнительные возможности библиотеки math.h):

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
#include <iostream>
#include <iomanip>
#include <math.h>
#include <conio.h>
#include <fstream>
 
using namespace std;
 
float analytical(short int n)
{
    return pow(1.0/3.0,n);
    /*float buff = 1.0/3.0;
    for(int i = 0; i < n; i++) buff = buff * (1.0/3.0);
    return buff;*/
}
 
float numerical(short int n)
{
    if( n == 0 ) return 1.0;
    if( n == 1 ) return 1.0/3.0;
    if( n > 1 ) return ( 19.0/3.0 * numerical(n - 1) - 2 * numerical(n - 2) );
    /*if(n > 1)
    {
        float first = 1.0;
        float second = 1.0/3.0;
        float outputf = 0;
        for(int i = 1; i < n; i++)
        {
            outputf = (19.0/3.0 * second - 2 * first);
            first = second;
            second = outputf;
        }
        return outputf;
    }*/
}
 
int main()
{
    ofstream outputfile("output.txt");
    //cout.flags(std::ios::fixed);
    outputfile.flags(std::ios::fixed);
 
    for(short int n = 0; n < 21; n++)
    {
        outputfile << setw(3) << n << setw(30) << setprecision(12) << analytical(n) << setw(30) << numerical(n) << setw(30) << abs( (analytical(n) - numerical(n))/analytical(n) ) << setw(30) << abs( analytical(n) - numerical(n) ) << endl;
    }
    getch();
    outputfile.close();
    return 0;
}
Проблема следующая:
При выводе значения функции "numerical", уже на n = 8 значение начинается увеличиваться вместо того чтоб дальше убывать, в следствии и погрешность неправильная. По моему мнению вся проблема в типе данных, float не достаточно большой, а при использование double, значение начинает возрастать чуть позже, на n = 14. Но тогда такой вопрос, почему такая же проблема не возникает с pow(1.0/3.0,n)? Надеюсь кто-то сможет дать мне ответы. Заранее спасибо!

Если проблема еще не ясна, можете скомпилировать программу или же глянуть мой вывод ниже.
Вывод:
Когда float -
Кликните здесь для просмотра всего текста

Когда double -
Кликните здесь для просмотра всего текста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2013, 20:04     Возможная пробелами с типами данных
Посмотрите здесь:

Помогите разобраться с типами данных C++
C++ Проблема с типами данных
C++ Пoмoгите со строковыми типами данных
C++ Работа с типами данных в массиве
Путаница с типами данных TCHAR и char. Какой тип данных выбрать? C++
C++ Работа со структурными типами данных
C++ Двухмерный массив с разными типами данных
C++ Ошибка с типами данных в подпрограмме

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
07.10.2013, 21:03     Возможная пробелами с типами данных #2
Больше действий - больше погрешность. В pow чтобы получить n-ую степень надо сделать грубо говоря logn операций. А при вычислении по этой формуле число операций растет экспоненциально. Ну и вот.
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 82
07.10.2013, 21:23  [ТС]     Возможная пробелами с типами данных #3
Получается используя формулу, рано или поздно по любому будет выходить фуфло? Раз так, то ладно. Спасибо за ответ!
Yandex
Объявления
07.10.2013, 21:23     Возможная пробелами с типами данных
Ответ Создать тему
Опции темы

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