maks2002 Temat założony przez niniejszego użytkownika |
Long long double za male i GMP » 2016-09-07 23:48:39 Witam serdecznie. Jak w temacie- mam problem z oblicznaniem liczb powyżej kilkunastocyfrowych^3 i wyższych. Wychodzi mi błędny wynik. Próbowałem nawet w mathlabie, ale niestety, (chyba jadą na jednym oprogramowaniu). Sprawdzałem na jednej operacji liczenia- jest błędna. Czy ktoś jest w stanie podać mi jakaś inna bibliotekę, lub podać jakiś program który będzie obliczał takie liczby poprawnie? Problemem nie jest użycie pamięci- jest małe, program sam się "zeruje" po pętli. Proszę o podpowiedź. |
|
darko202 |
» 2016-09-08 08:41:51 Pewnie są jakieś biblioteki, ale trzeba zastosować prosty algorytm mnożenia pisemnego https://www.medianauka.pl/mnozenie_pisemneliczby zapamiętujesz w jakimś kontenerze (np. tablica, wektor,...) piszesz własną funkcję mnożącą takie 2 elementy podobnie do przedstawionego rozwiązania na https://www.matematyka.pl/270752.htmz opisu wynika, że musisz poszukać lepszego kodu od tam przedstawionego, ale idea jest podobna oczywiście jeśli to za mało to zastosuj algorytm mnożenia lepszy pod względem złożoności obliczeniowej np. https://pl.wikipedia.org/wiki/Algorytm_Karacubyale to już chyba przesada bo odpowiednio zaiplementowany prosty algorytm mnożenia pisemnego jest dostatecznie szybki do rozwiązań szkolnych |
|
mateczek |
» 2016-09-08 09:12:05 jeśli interesuje Cię c++ to masz gmp i boost Pod linuxem skorzystanie z tej biblioteki jest banalnie proste https://www.youtube.com/watch?v=Mr6yAf9XpE0Pod windowsem będziesz musiał się trochę pomęczyć. Pytanie czy chcesz robić obliczenia na intach ?? czy na liczbach rzeczywistych?? To pierwsze lepiej. Bo arytmetyka zmienno przecinkowa to zawsze przybliżenia. Jeśli zadeklarujesz długość mantysy na 3 cyfry to obliczenie 44*33= stracisz ostatnią cyfrę Co chcesz robić z wielkimi liczbami jakie obliczenia?? |
|
maks2002 Temat założony przez niniejszego użytkownika |
» 2016-09-08 15:26:58 Niestety, samo mnożenie już wykazuje błędy, a więc nie wchodzi w grę odp od Darko202. Oczywiście, działam na int, Jednak wynik musi zostać spierwiastkowany, wtedy wchodzą real. A macie coś jeszcze oprócz biblioteki boots?
|
|
darko202 |
» 2016-09-08 16:24:11 a co chcesz naprawdę zrobić ? tzn. opisz kolejne operacje jakie musisz wykonać i pokaż przykład choć 1 liczby którą chcesz obliczyć nie wyobrażam sobie co może oznaczać "samo mnożenie już wykazuje błędy" algorytm prostego mnożenia sposobem pisemnym zawsze działa. realizowałem go przy liczeniu dużych silni np. oblicz 1000000! w sposób wcześniej zaproponowany i był szybki, choć widziałem, że można to zrobić jeszcze szybciej. algorytm pierwiastkowania opisany na np. http://pl.sci.matematyka.narkive.com/fZTY9XVt/algorytm-pierwiastkowaniateż wygląda na prosty pierwiastkowanie to funkcja odwrotna do potęgowania - a to wielokrotne mnożenie z czym masz problem ? |
|
mateczek |
» 2016-09-08 16:42:39 gmp biblioteka jeśli ci nie działa to wklej kod z oczekiwanym wynikiem szukasz liczb pierwszych?? pierwiastkowanie wystarczy z wynikiem zaokrąglonym do int |
|
maks2002 Temat założony przez niniejszego użytkownika |
» 2016-09-08 16:50:28 Może i liczy, mi tez liczy. Ale niepoprawnie. Np: liczba 1234567891011 ^3 (oczywiście x*x*x) daje wynik:13227051169280585435. Pytanie: dlaczego na końcu tego jest 5? przecież jak końcówka jest 1 to musi być w wyniku 1- chyba że się mylę....
Akurat nie liczb pirwszych- próbuję się z Feramatem ;) blisko było: 1321837206775723^(1/3)-1 =718336124103879^(1/3)+603501082671843^(1/3) |
|
mateczek |
» 2016-09-08 17:18:53 #include<iostream> #include <gmpxx.h> using namespace std;
int main() { mpz_class a, c; a = "1234567891011"; c = a * a * a; cout << c; return 0; }
wynik=1881676376411925699615487319217434331 |
|
« 1 » 2 3 4 |