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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.80
cruzer121312
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 21
#1

Корень из 2 с точностью до 100 знаков после запятой - C++

15.11.2012, 16:45. Просмотров 4106. Ответов 30
Метки нет (Все метки)

Добрый день. Задача такова, программа должна выразить корень из 2 с точностью до 100 знаков после запятой, может есть предложения как это сделать? Могу выбрать между С и С++ языками. Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 16:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Корень из 2 с точностью до 100 знаков после запятой (C++):

Форматированный вывод с точностью до двух знаков после запятой - C++
Здравствуйте! У меня массив заполняется дробными числами с точностью до двух знаков после запятой. Как сделать, чтобы прога приписывала...

Как в языке С++ вывести значение изменения с точностью k знаков после запятой? - C++
Как в языке С + + вывести значение изменения с точностью k знаков после запятой?

Количество знаков после запятой - C++
#include <iostream> #include <iomanip> using namespace std; int main() { float g = 10.53446; printf("%.4f\n", g); ...

Вывод n знаков после запятой - C++
Как это сделать?

Число знаков после запятой - C++
Никогда не задумывался, но можно-ли ограничить число знаков во флоате, не для вывода, а для рассчетов?

Количество знаков после запятой - C++
После запятой нужно всешжа показывать определенные число знаков, например шесть: 263.000000 Иными словами, даже если там нули ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
16.11.2012, 18:30 #16
Цитата Сообщение от cruzer121312 Посмотреть сообщение
На мой взгляд, тут дело не в сложной математике, а в изьянах программировании, которое, кстате, не относится к моей специальности. Поэтому я прошу помощи гуру в этом деле)
нууу. тебе наверное лучше знать как реализовать длинную арифметику.

Добавлено через 2 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Еще идея - промежуточные результаты хранить не в виде просто чисел (длинных!) а в виде рациональных, т.е. пар (числитель, знаменатель) (все длинные!)
Конечно это будет проще длинной арифметики с плавающей точкой, но как мы определим, что дошли до значения с сотым знаком после запятой и выведем его? Возвращаться назад к той же длинной арифметике с плавающей точкой? или реализовать вывод делением рац.дроби в столбик?
Байт
Эксперт C
15982 / 10250 / 1536
Регистрация: 24.12.2010
Сообщений: 19,332
16.11.2012, 19:13 #17
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
как мы определим, что дошли до значения с сотым знаком после запятой и выведем его?
C++
1
 while (100* P < Q)
P, Q - длинные числа, представляющие числитель и знаменатель
cruzer121312
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 21
18.11.2012, 16:40  [ТС] #18
Неужели нету чтото вроде mega long int который бы 100 знаков показывал ?
Байт
Эксперт C
15982 / 10250 / 1536
Регистрация: 24.12.2010
Сообщений: 19,332
18.11.2012, 22:36 #19
Цитата Сообщение от cruzer121312 Посмотреть сообщение
Неужели нету что-то вроде mega long int который бы 100 знаков показывал ?
Ищи библиотеки или сделай их сам. Это не так сложно, если знаешь о чем идет речь и сможешь вспомнить и обобщить простые вещи, которым учили в школе: Сложение (вычитание) столбиком, умножение (столбиком) и деление (тем же столбиком). ИМХО,сделать самому значительно полезнее. 1. Кой-чему научишься. 2. Что не так, сам изменишь и добавишь.
Удачи!

Добавлено через 1 минуту
И не торопись (не суетись, т,е.) зачет завтра, а жизнь - впереди.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
18.11.2012, 22:48 #20
Макросы, используйте их. Написатьообощенный вид кода, для двух-трехзнаков, и потом загнать в сторазоповторяющийсямакрос
Байт
Эксперт C
15982 / 10250 / 1536
Регистрация: 24.12.2010
Сообщений: 19,332
18.11.2012, 22:59 #21
Цитата Сообщение от Tiva Посмотреть сообщение
Макросы, используйте их. Написать обобщенный вид кода, для двух-трех знаков, и потом загнать в сторазоповторяющийся макрос
Любопытный подход. Не набросаете ли вариант?
sanek7
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 6
19.11.2012, 00:14 #22
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
int main () {
  double f =sqrt(2.0);
  
  cout << fixed;
 
  cout << setprecision (100) << f << endl;
  system ("pause");
  return 0;
}
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
19.11.2012, 00:16 #23
Да хоть 1000 напишите, дабл столько не вместит... и не думаю, что ноли кого-то интересуют
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
19.11.2012, 00:23 #24
Если программирование не относится к специальности, то задание выглядит довольно жестоким. Впрочем, возможно это оттого, что я не знаю какого-то простого способа.
Пока же реализовал алгоритм извлечения квадратного корня столбиком из википедии. Подкоренное число должно быть целым. В результате получается массив цифр результата.
В принципе не очень сложно реализовать длинную арифметику для этой задачи (нужно сложение, вычитание и умножение), но я взял библиотеку gmp.
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
#include <iostream>
#include <vector>
#include <gmpxx.h>
 
std::vector<int> sqrt(int x, int N)
{
    std::vector<int> d, g;
    while (x > 0)
    {
        g.push_back(x % 100);
        x /= 100;
    }
    mpz_class b;
    mpz_class c;
    while (N > 0)
    {
        c *= 100;
        if (!g.empty())
        {
            c += g.back();
            g.pop_back();
        }
        else
            --N;
        int a = 0;
        while ((a + b + 1)*(a + 1) <= c && a < 9)
            ++a;
        c -= (a + b)*a;
        d.push_back(a);
        b = b * 10 + a * 20;
    }
    return d;
}
 
int main()
{
    std::cout << "length of the fractional part: ";
    int N;
    std::cin >> N;
    std::cout << "value: ";
    int v;
    std::cin >> v;
 
    std::vector<int> s = sqrt(v, N);
    int k = s.size() - N;
    std::cout << "sqrt(" << v << ")=";
    for (unsigned i = 0; i < s.size(); ++i)
    {
        if (i == k)
            std::cout << '.';
        std::cout << s[i];
    }
    std::cout << std::endl;
}
Кто может — проверяйте результат
Код
length of the fractional part: 100 
value: 2
sqrt(2)=1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
sanek7
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 6
19.11.2012, 00:24 #25
Цитата Сообщение от Croessmah Посмотреть сообщение
Да хоть 1000 напишите, дабл столько не вместит... и не думаю, что ноли кого-то интересуют
...не судите строго)) я только начал изучать С++...
cruzer121312
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 21
21.11.2012, 15:40  [ТС] #26
gmpxx.h: No such file or directory.


В чем дело?

Добавлено через 29 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если программирование не относится к специальности, то задание выглядит довольно жестоким. Впрочем, возможно это оттого, что я не знаю какого-то простого способа.
Пока же реализовал алгоритм извлечения квадратного корня столбиком из википедии. Подкоренное число должно быть целым. В результате получается массив цифр результата.
В принципе не очень сложно реализовать длинную арифметику для этой задачи (нужно сложение, вычитание и умножение), но я взял библиотеку gmp.
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
#include <iostream>
#include <vector>
#include <gmpxx.h>
 
std::vector<int> sqrt(int x, int N)
{
    std::vector<int> d, g;
    while (x > 0)
    {
        g.push_back(x % 100);
        x /= 100;
    }
    mpz_class b;
    mpz_class c;
    while (N > 0)
    {
        c *= 100;
        if (!g.empty())
        {
            c += g.back();
            g.pop_back();
        }
        else
            --N;
        int a = 0;
        while ((a + b + 1)*(a + 1) <= c && a < 9)
            ++a;
        c -= (a + b)*a;
        d.push_back(a);
        b = b * 10 + a * 20;
    }
    return d;
}
 
int main()
{
    std::cout << "length of the fractional part: ";
    int N;
    std::cin >> N;
    std::cout << "value: ";
    int v;
    std::cin >> v;
 
    std::vector<int> s = sqrt(v, N);
    int k = s.size() - N;
    std::cout << "sqrt(" << v << ")=";
    for (unsigned i = 0; i < s.size(); ++i)
    {
        if (i == k)
            std::cout << '.';
        std::cout << s[i];
    }
    std::cout << std::endl;
}
Кто может — проверяйте результат
Код
length of the fractional part: 100 
value: 2
sqrt(2)=1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
fatal error: gmpxx.h: No such file or directory|
Байт
Эксперт C
15982 / 10250 / 1536
Регистрация: 24.12.2010
Сообщений: 19,332
21.11.2012, 15:46 #27
Цитата Сообщение от cruzer121312 Посмотреть сообщение
fatal error: gmpxx.h: No such file or directory|
Нет такого файла. библиотеку gmp надо установить
cruzer121312
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 21
21.11.2012, 15:52  [ТС] #28
Цитата Сообщение от Байт Посмотреть сообщение
Нет такого файла. библиотеку gmp надо установить
а заменить другой библиотекой можно? Потомучто препод сказал, что можно использовать только стандартные библиотеки...
Байт
Эксперт C
15982 / 10250 / 1536
Регистрация: 24.12.2010
Сообщений: 19,332
21.11.2012, 15:56 #29
Цитата Сообщение от cruzer121312 Посмотреть сообщение
можно использовать только стандартные библиотеки...
Тогда придется свою писать...
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
27.11.2012, 22:23 #30
Вот с реализацией только необходимых операций. Об эффективности или красоте речи нет, главное было реализовать как можно меньше думая
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
131
132
133
134
135
#include <iostream>
#include <vector>
#include <deque>
 
class Big
{
public:
    void mult10() { if (!v.empty()) v.push_front(0); }
    void add(unsigned char a)
    {
        for (unsigned i = 0; a > 0; ++i)
        {
            if (i >= v.size())
                v.push_back(0);
            v[i] += a % 10;
            a /= 10;
            if (v[i] > 9)
            {
                v[i] -= 10;
                ++a;
            }
        }
    }
    void sub(Big const& a)
    {
        unsigned char c = 0;
        unsigned i;
        for (i = 0; i < a.v.size(); ++i)
        {
            v[i] += 10 - a.v[i] - c;
            if (v[i] >= 10)
            {
                v[i] -= 10;
                c = 0;
            }
            else
                c = 1;
        }
        while (c && i < v.size())
        {
            if (v[i] > 0)
            {
                --v[i];
                c = 0;
            }
            else
                v[i] = 9;
            ++i;
        }
        while (!v.empty() && v.back() == 0)
            v.pop_back();
    }
    bool operator<=(Big const& a) const
    {
        unsigned s = a.v.size();
        if (s != v.size())
            return s > v.size();
        if (v.empty())
            return true;
        while (--s > 0 && a.v[s] == v[s])
            ;
        return v[s] <= a.v[s];
    }
    std::ostream& Print(std::ostream &out) const
    {
        for (unsigned i = v.size(); i > 0; )
            out << (unsigned)v[--i];
        return out;
    }
private:
    std::deque<unsigned char> v;
};
 
std::ostream& operator<<(std::ostream &out, Big const& big)
{
    return big.Print(out);
}
 
std::vector<unsigned char> sqrt(unsigned x, unsigned N)
{
    std::vector<unsigned char> d, g;
    while (x > 0)
    {
        g.push_back(x % 100);
        x /= 100;
    }
    Big b;
    Big c;
    while (N > 0 || !g.empty())
    {
        c.mult10();
        c.mult10();
        if (!g.empty())
        {
            c.add(g.back());
            g.pop_back();
        }
        else
            --N;
        unsigned char a = 0;
        Big b1 = b;
        b1.add(1);
        while (a < 9 && b1 <= c)
        {
            c.sub(b1);
            b1.add(2);
            ++a;
        }
        d.push_back(a);
        b.mult10();
        b.add(a * 20);
    }
    return d;
}
 
int main()
{
    std::cout << "length of the fractional part: ";
    int N;
    std::cin >> N;
    std::cout << "value: ";
    int v;
    std::cin >> v;
 
    std::vector<unsigned char> s = sqrt(v, N);
    int k = s.size() - N;
    std::cout << "sqrt(" << v << ")=";
    for (unsigned i = 0; i < s.size(); ++i)
    {
        if (i == k)
            std::cout << '.';
        std::cout << (unsigned)s[i];
    }
    std::cout << std::endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 22:23
Привет! Вот еще темы с ответами:

Вывести n знаков после запятой - C++
Всем привет, не знаю как через cout вывести 8 знаков после запятой. Заранее спасибо

Увеличение количества знаков после запятой - C++
Хочу записать в txt файл переменную типа double с точностью больше чем 5 знаков после запятой пишу такой код myfile.open...

Максимальное количество знаков после запятой - C++
Подскажите пожалуйста, как сделать, чтобы после запятой у меня выводилось максимальное количество знаков. В типе double их вроде 16. Когда...

Насчёт числа знаков после запятой - C++
Вот например у меня массив с числами, у которых по 5 знаков после запятой. Как мне (с помощью какой функции или операции) сделать так чтобы...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.11.2012, 22:23
Ответ Создать тему
Опции темы

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