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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
14.06.2012, 04:39     Вычисления с большой точностью (gmp) #1
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-го) ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrey.K
 Аватар для Andrey.K
338 / 259 / 15
Регистрация: 14.11.2010
Сообщений: 480
14.06.2012, 12:14     Вычисления с большой точностью (gmp) #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;
}
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
14.06.2012, 13:03  [ТС]     Вычисления с большой точностью (gmp) #3
Так мне испльзовать надо а не просто вывести... т.е запихуть в обьект класса mpf_t
Хотя конечно это тожн идея преобразовывать строку и передавать её этому типу...

Но как-то это не так...
Andrey.K
 Аватар для Andrey.K
338 / 259 / 15
Регистрация: 14.11.2010
Сообщений: 480
14.06.2012, 13:09     Вычисления с большой точностью (gmp) #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;
}
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
14.06.2012, 13:16  [ТС]     Вычисления с большой точностью (gmp) #5
C++
1
cout.setf(ios::fixed,3);
Это не работает...
Ну, число е только можно выводить, с ним можно работать:
Вы явно ничего не поняли... это ведь не изменит само число(да и по сути не может), оно просто его выведет в формате...
мне надо получить уже в mpf_t "округленное" число а не его double-представление.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
15.06.2012, 22:35  [ТС]     Вычисления с большой точностью (gmp) #6
Покаместь вижу такое решение:

1. Переменную типа double умножать на 10^n
2. Приводить его к int-типу с округлением
3. Затем передавать его в mpf_t и там делить на 10^n.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
15.06.2012, 23:36     Вычисления с большой точностью (gmp) #7
Цитата Сообщение от Avazart Посмотреть сообщение
Покаместь вижу такое решение:

1. Переменную типа double умножать на 10^n
2. Приводить его к int-типу с округлением
3. Затем передавать его в mpf_t и там делить на 10^n.
Только логичнее все эти операции (умножение-округление-деление) делать с mpf_t, без приведения к int, диапазона которого может не хватить.
А вообще, цель какая? Для эстетики? Просто если некоторые вычисления делать в double, то ошибка будет определяться именно его точностью. Округление тут может лишь оптическую иллюзию создать, чтобы глаз радовался ноликам. А если требуется задавать какие-то константы, то их можно задавать в виде строки, без привлечения double.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
15.06.2012, 23:39  [ТС]     Вычисления с большой точностью (gmp) #8
Да к тому что удобнее некоторые дейстия с double (и наверное быстрее) на не котором участке, на котором не особо важна точность.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
15.06.2012, 23:40     Вычисления с большой точностью (gmp) #9
И ещё, если потребуются числа вроде 1.2e+57, то умножение-округление-деление не поможет.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
15.06.2012, 23:51  [ТС]     Вычисления с большой точностью (gmp) #10
Ну тут по идее обратный случай деление-округление-умножение
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
15.06.2012, 23:59     Вычисления с большой точностью (gmp) #11
Цитата Сообщение от Avazart Посмотреть сообщение
Да к тому что удобнее некоторые дейстия с double (и наверное быстрее) на не котором участке, на котором не особо важна точность.
Удобнее и быстрее — да. Но округление при этом носит лишь эстетический характер. Точность с его помощью можно повысить лишь при одном условии: если известно, что результат является конечной десятичной дробью (при этом с не слишком большим знаменателем).

Цитата Сообщение от Avazart Посмотреть сообщение
Ну тут по идее обратный случай деление-округление-умножение
Ну, то есть ещё и порядок учитывать надо. Но по-моему, баловство это всё.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2012, 00:15     Вычисления с большой точностью (gmp)
Еще ссылки по теме:

Написать программу для вычисления ряда с заданной точностью C++
Вычисления с заданной точностью C++
C++ Найти с точностью до E = 10^-3 матрицу B по заданной формуле вычисления

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
16.06.2012, 00:15  [ТС]     Вычисления с большой точностью (gmp) #12
баловство это всё.
Ну в принципе да согласен...

Основная проблема при вводе, но для этого можно передавать значение как строку...
Yandex
Объявления
16.06.2012, 00:15     Вычисления с большой точностью (gmp)
Ответ Создать тему
Опции темы

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