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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
#1

Вычисления с большой точностью (gmp) - C++

14.06.2012, 04:39. Просмотров 1896. Ответов 11
Метки нет (Все метки)

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
//---------------------------------------------------------------------------
#pragma hdrstop
 
#include <tchar.h>
 
#include <windows.h>
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <cmath>
#include "gmp.h"
//---------------------------------------------------------------------------
#pragma argsused
 
int _tmain(int argc, _TCHAR* argv[])
{
  mpf_set_default_prec(1024);
 
   mpf_t x,y,z;
   int n=40;
   //  x
   mpf_init(x);
   double d=10.1;
   std::cout<<"d= "<<std::setprecision(n)<<d<<std::endl;
   mpf_init_set_d(x,d);
   gmp_printf ("x= %.*Ff \n", n, x);
   //  y
   mpf_init(y);
   mpf_init_set_d(y,7.2);
   gmp_printf ("y= %.*Ff \n", n, y);
   // z =  x / y
   mpf_init_set_d(z,0);
 
   mpf_div(z,x,y);
   gmp_printf ("z= %.*Ff \n", n, z);
 
   mpf_clear(x);
   mpf_clear(y);
   mpf_clear(z);
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Вывод:
Код
d= 10.099999999999999645
x= 10.0999999999999996447286321199499070644379
y= 7.2000000000000001776356839400250464677811
z= 1.4027777777777776938257280761841525638908
Для продолжения нажмите любую клавишу . . .
Вот что то читаю мануал по gmp не могу найти как решается такой момент...
Как передать double в mpf_t без хвостов...тобишь обрезать(и/или округлить) до какого-то знака поле запятой( например 12-го) ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2012, 04:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисления с большой точностью (gmp) (C++):

Вычисления с точностью эпсилон - C++
Здравствуйте.Хотел спросить о вычислениях с точностью эпсилон. Например, есть задание:Есть 2 числа.Вычислить их сумму с точностью до...

Вычисления с заданной точностью - C++
Кому не сложно составьте код пожалуйста) Составить программу для вычисления с заданной точностью E Формулы надо переписывать! ...

Вычисления гиперболического косинуса с заданной точностью - C++
Добрый вечер, прошу помочь с задачей. Дано: Написать программу для вычисления гиперболического косинуса с заданной точностью е(е&gt;0);...

Найти с точностью до E = 10^-3 матрицу B по заданной формуле вычисления - C++
Квадратная матрица A третьего порядка сформирована из вещественных чисел, принадлежащих диапазону . Найти с точностью до E = 10^-3 ...

Написать алгоритм вычисления точки максимума с точностью h - C++
Сразу хочу спросить по этой же теме (Циклы): Как решить эту задачу с помоьщю цикла: Функция...

Составить функцию вычисления суммы с точностью эпсилон - C++
Даны действительные числа x, эпсилон(x не равно 0, 1 больше или равно эпсилон больше 0). Составить функцию вычисления суммы с точностью...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Andrey.K
342 / 263 / 15
Регистрация: 14.11.2010
Сообщений: 482
14.06.2012, 12:14 #2
Неуверен, конечно, но мб подойдет такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <conio.h>
using namespace std;
void fun(double x)
{
    cout<<x;
}
int main() 
{
    cout.setf(ios::fixed,3);// отрезает с конца числа
    double x=3.123456789;
    fun(x);
    getch();
    return 0;
}
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
14.06.2012, 13:03  [ТС] #3
Так мне испльзовать надо а не просто вывести... т.е запихуть в обьект класса mpf_t
Хотя конечно это тожн идея преобразовывать строку и передавать её этому типу...

Но как-то это не так...
0
Andrey.K
342 / 263 / 15
Регистрация: 14.11.2010
Сообщений: 482
14.06.2012, 13:09 #4
Цитата Сообщение от Avazart Посмотреть сообщение
Так мне испльзовать надо а не просто вывести... т.е запихуть в обьект класса mpf_t
Хотя конечно это тожн идея преобразовывать строку и передавать её этому типу...

Но как-то это не так...
Ну, число не только можно выводить, с ним можно работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <conio.h>
using namespace std;
void fun(double x)
{
    cout<<x<<endl;
    x+=1.3;
    cout<<x;
}
int main() 
{
    cout.setf(ios::fixed,3);// отрезает с конца числа
    double x=3.123456789;
    fun(x);
    getch();
    return 0;
}
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
14.06.2012, 13:16  [ТС] #5
C++
1
cout.setf(ios::fixed,3);
Это не работает...
Ну, число е только можно выводить, с ним можно работать:
Вы явно ничего не поняли... это ведь не изменит само число(да и по сути не может), оно просто его выведет в формате...
мне надо получить уже в mpf_t "округленное" число а не его double-представление.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
15.06.2012, 22:35  [ТС] #6
Покаместь вижу такое решение:

1. Переменную типа double умножать на 10^n
2. Приводить его к int-типу с округлением
3. Затем передавать его в mpf_t и там делить на 10^n.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
15.06.2012, 23:36 #7
Цитата Сообщение от Avazart Посмотреть сообщение
Покаместь вижу такое решение:

1. Переменную типа double умножать на 10^n
2. Приводить его к int-типу с округлением
3. Затем передавать его в mpf_t и там делить на 10^n.
Только логичнее все эти операции (умножение-округление-деление) делать с mpf_t, без приведения к int, диапазона которого может не хватить.
А вообще, цель какая? Для эстетики? Просто если некоторые вычисления делать в double, то ошибка будет определяться именно его точностью. Округление тут может лишь оптическую иллюзию создать, чтобы глаз радовался ноликам. А если требуется задавать какие-то константы, то их можно задавать в виде строки, без привлечения double.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
15.06.2012, 23:39  [ТС] #8
Да к тому что удобнее некоторые дейстия с double (и наверное быстрее) на не котором участке, на котором не особо важна точность.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
15.06.2012, 23:40 #9
И ещё, если потребуются числа вроде 1.2e+57, то умножение-округление-деление не поможет.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
15.06.2012, 23:51  [ТС] #10
Ну тут по идее обратный случай деление-округление-умножение
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
15.06.2012, 23:59 #11
Цитата Сообщение от Avazart Посмотреть сообщение
Да к тому что удобнее некоторые дейстия с double (и наверное быстрее) на не котором участке, на котором не особо важна точность.
Удобнее и быстрее — да. Но округление при этом носит лишь эстетический характер. Точность с его помощью можно повысить лишь при одном условии: если известно, что результат является конечной десятичной дробью (при этом с не слишком большим знаменателем).

Цитата Сообщение от Avazart Посмотреть сообщение
Ну тут по идее обратный случай деление-округление-умножение
Ну, то есть ещё и порядок учитывать надо. Но по-моему, баловство это всё.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
16.06.2012, 00:15  [ТС] #12
баловство это всё.
Ну в принципе да согласен...

Основная проблема при вводе, но для этого можно передавать значение как строку...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2012, 00:15
Привет! Вот еще темы с ответами:

Написать программу для вычисления ряда с заданной точностью e (e>0) - C++
Здравствуйте! Помогите написать программу для вычисления ряда с заданной точностью e (e&gt;0).

Написать программу для вычисления числа с заданной точностью. - C++
Нужно написать программу для вычисления числа y=\sqrt{x} с заданной точностью. -------- За введенными x, k, \varepsilon (точность...

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

Написать программу для вычисления ряда с заданной точностью e (e>0) - C++
Здравствуйте! Помогите написать программу для вычисления ряда с заданной точностью e (e&gt;0).


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

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

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