Większa dokładność przy dzieleniu a/b
Ostatnio zmodyfikowano 2019-10-15 21:36
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. #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? |
|
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 10 64. 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. |
|
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: #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! |
|
« 1 » |