Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Większa dokładność przy dzieleniu a/b

Ostatnio zmodyfikowano 2019-10-15 21:36
Autor Wiadomość
kwdrt3000
Temat założony przez niniejszego użytkownika
Większa dokładność przy dzieleniu a/b
» 2019-10-14 21:21:17
Witam, mam problem z osiągnięciem większej precyzji przy dzieleniu a/b. Napisany przeze mnie program miał na celu wypisanie wyniku dzielenia a/b z dokładnością n, gdzie n ma być rzędu 100.

C/C++
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    long double a, b, n;
   
    cout << "Podaj a:";
    cin >> a;
    cout << "Podaj b:";
    cin >> b;
    cout << "Podaj n:";
    cin >> n;
   
    cout << fixed << setprecision( n ) << a / b;
    return 0;
}

Program wypisuje cyfry tylko do 64 po przecinku, potem wyrzuca same zera. Jak można zwiększyć precyzję bez używania żadnych dodatkowych bibliotek?
P-175369
pekfos
» 2019-10-14 21:42:25
Jak można zwiększyć precyzję bez używania żadnych dodatkowych bibliotek?
Implementując samemu to, co by było w tych dodatkowych bibliotekach. 64 cyfry po przecinku są nierealne. Żeby mieć prawdziwe 64 cyfry po przecinku, musiałbyś mieć typ nie mniejszy niż całkowitoliczbowy, który pomieści liczby od 0 do 1064. Szybkie użycie kalkulatora mówi że to co najmniej 213 bitów. 100 cyfr po przecinku to by było 333 bity i to rozważając wyłącznie liczby z przedziału [0, 1]. Im większe liczby, tym mniejsza precyzja. Wszystkie obliczenia na typach zmiennoprzecinkowych są wykonywane tylko w przybliżeniu, dlatego nie nadają się do przeprowadzania obliczeń wymagających takich precyzji.
P-175370
kwdrt3000
Temat założony przez niniejszego użytkownika
» 2019-10-15 21:36:55
Udało mi się rozwiązać problem, implementacja zrobiona na szybko:

C/C++
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main()
{
   
    long double a, b, c, n;
    int t = 1;
   
    cout << "Podaj a:";
    cin >> a;
    cout << "Podaj b:";
    cin >> b;
    cout << "Podaj n:";
    cin >> n;
   
    if( a / b > 0 )
    {
        cout << trunc( a / b );
        c = 10 * fmod( a, b );
        cout << ".";
    }
    else
    {
        cout << "0.";
    }
   
    while( t <= n )
    {
        cout << trunc( c / b );
        c = 10 * fmod( c, b );
        t++;
    }
   
    return 0;
}

Dla mnie wystarczyło wypisanie wyniku do n miejsc po przecinku, np dla 2/3, 20/3 otrzymuję prawidłowy wynik, przy n około 900 dalej jest ok.

Rzeczywiście trudne jest przechowywanie tak dużej liczby jako, cóż, liczby w samym C++ bez bibliotek, ale okazało się że problem mogę rozwiązać bez uciekania się do korzystania z nich.

Dzięki za pomoc!
P-175378
« 1 »
  Strona 1 z 1