Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> gmplib, разложение sin,cos через ряд тейлора 
:(
    Опции темы
FANATID
Дата 6.10.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



всем добрый день.
проблема с gmplib (gmplib.org), почему то дальше 16 знака результаты функций расходятся, т.е. получается такой же результат как будто использовали тип double и совсем не использовался gmplib

Код


#include <iostream>
#include <gmp.h>

using namespace std;

//sin(M_PI_4) = 0,70710678118654752440084436210485
#define M_PI_4 0.78539816339744830962
#define top 100
#define numsize 400

string msin( long double x )
{
    mpf_t ret, temp, num;
    mp_exp_t exp;
    int i, j;
    string str;
    
    mpf_init_set_d( num, x );
    mpf_init2( ret, numsize );
    mpf_init2( temp, numsize );
    
    for( i = 1 ; i <= top ; i += 2 )
    {
        mpf_pow_ui( temp, num, i );
        for( j = 1 ; j <= i ; ++j )
            mpf_div_ui( temp, temp, j );
        if ( (i-1)%4 )
            mpf_sub( ret, ret, temp );
        else
            mpf_add( ret, ret, temp );
    }
    str = mpf_get_str( NULL, &exp, 10, 100, ret );
    str.insert( exp, "." );
    if ( str[0] == '.' )
        str.insert( 0, "0" );
    
    mpf_clear( ret );
    mpf_clear( temp );
    mpf_clear( num );
    
    return str;
}

string mcos( long double x )
{
    mpf_t ret, temp, num;
    mp_exp_t exp;
    int i, j;
    string str;
    
    mpf_init_set_d( num, x );
    mpf_init2( ret, numsize );
    mpf_set_ui( ret, 1 );
    mpf_init2( temp, numsize );
    
    for( i = 2 ; i <= top ; i += 2 )
    {
        mpf_pow_ui( temp, num, i );
        for( j = 1 ; j <= i ; ++j )
            mpf_div_ui( temp, temp, j );
        if ( i%4 )
            mpf_sub( ret, ret, temp );
        else
            mpf_add( ret, ret, temp );
    }
    str = mpf_get_str( NULL, &exp, 10, 100, ret );
    str.insert( exp, "." );
    if ( str[0] == '.' )
        str.insert( 0, "0" );
    
    mpf_clear( ret );
    mpf_clear( temp );
    mpf_clear( num );
    
    return str;
}

int main( int argc, char **argv )
{
    cout << msin(M_PI_4) << "\n" << mcos(M_PI_4) << endl;    
    return 0;
}

результат:
Код

0.7071067811865475027519429562175167462615432395374927895243661191374820215180439262178569226352083047
0.7071067811865475460497457679921806695016833414255741071584738764970363707358438601656581438402126333

PM WWW ICQ   Вверх
alexvs11
Дата 6.10.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



но для M_PI_4 вы же использовали double, странно было бы если точность оказалась бы выше

Добавлено через 2 минуты и 12 секунд
Цитата(FANATID @  6.10.2010,  20:14 Найти цитируемый пост)
#define M_PI_4 0.78539816339744830962

это константа типа double
PM MAIL   Вверх
FANATID
Дата 7.10.2010, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



да, спасибо. помоголо. Казалось, что даже с такой точностью числа пи с помощью длинной арифметики можно посчитать большее колличество знаков
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1080 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.