mam taki problem zwiazany z typem float. Musze operować na dużych liczbach rzędu 10^20. Wybrałem do tego celu float, ponieważ ma on zakres -/+3.4e38. Jednak gdy wpisuje tak dużą liczbę jak np. 10^20 to mi ją obcina… Najwyższą liczbę, jaką wczytuje bez obcinania jest 10^10… Żeby wczytywać wyższe muszę używać double / long double.
Jednak czemu ten float nie dziala pomimo ze ma wyzszy zakres niz 10^20 ?
Liczby zmiennoprzecikowe reprezentowane są w komputerze jako cecha i mantysa. Różnica między float a double jest taka że mają one różną liczbę bitów przeznaczoną na ceche i mantyse.
Jeśli moje wyjaśnienia nie są dla Ciebie wystarczające wejdź na tą strone:
A gdzie/jak wczytujesz/wpisujesz te wartości? To stałe dosłowne w kodzie czy pobierane przez IO? Tak czy siak wydaje mi się, że 1e20 nie powinno stanowić problemu dla float. Pokaż jakiś fragment kodu, który sprawia problemy.
to co sadzicie o tym pomysle (max liczba cyfr w liczbie bedzie wynosic 19). (uzywam zapisu x^y bo nie chce pisac mi sie y zer)
pierwsze sprawdzamy czy liczba cyfr liczby long long jest wieksza od 15 (liczbę cyfr musze znac tez po cos innego wiec 2 pieczenie na 1 ogniu):
jeśli nie to po prostu konwertujemy tą liczbę na double i dajemy do sqrt - Koniec
Jeśli liczba cyfr > 15, to dzielimy liczbe przez 10^10 ( gdyby liczba miala 19 cyfr (dopuszczalne max) - to nam da 9 cyfr, a to sie zmiesci w double). I potem robimy cos takiego:
wynik = sqrt(double(podzielona_liczba)) * double(10^5);
Rzeczywiście… No ale niby long double ma ten sam zakres co double wg cplusplus.com, czyli przed przecinkiem może mieć 15 cyfr. A moja przykładowa liczba miała ich 18. Pierwiastek wyszedł dobry, ale jak to możliwe ?
Hehe, ale mi znaki po przecinku nie są w cale potrzebne. I tak pierwiastek bd porównywał z liczbą całkowitą (pisze algorytm dla obliczania liczb pierwszych). Dziwi mnie tylko fakt, że obiekt long double może mieć max 15 cyfr przed przecinkiem, natomiast mój obiekt long long ma ich czasem 19. Jak to możliwe że program obliczy dobry pierwiastek , skoro liczby przed przecinkiem nie powinny się pomieścic w long double ?
Aaa, rozumiem. I niejawna konwersja dodatkowo sprytnie zamienia ostatnią możliwą do wczytania cyfrę (5) o 1 większą, żeby user na tym nie stracił. W moim przypadku okazało się to przydatne