Przy dużych liczbach to nie jest takie proste. Nie wiem czy zdajesz sobie sprawę, ale największa liczba całkowita, zapisana na 4 bajtach (int) to około
\(\displaystyle{ 2 \cdot 10^9}\), tymczasem największa liczba zmiennoprzecinkowa zapisana na 4 bajtach (float) to około
\(\displaystyle{ 3 \cdot 10^{38}}\). Na pierwszy rzut oka wydaje się to nielogiczne, ale w gruncie rzeczy jest całkiem proste. Otóż duży zakres wynika ze sposobu reprezentacji liczby - floaty zapisane są w postaci wykładniczej, a inty wprost. Co za tym idzie, duży zakres obarczony jest sporym błędem, błąd (absolutna wartość błędu) jest tym większy, im większa liczba jest reprezentowana.
Przetestuj taki program
Kod: Zaznacz cały
int main()
{
float a = 248248248248248248248;
float b = a/2;
printf("%f",b);
}
Program nie powinien się w ogóle skompilować, ponieważ liczba
\(\displaystyle{ 248248248248248248248}\) jest liczbą całkowitą. Program "nie wie", że chcesz ją zapisać jako float, a konwersja byłaby wykonana dopiero po przypisaniu liczby do zmiennej. Liczby zmiennoprzecinkowe muszą mieć "." w zapisie. W związku z tym wprowadź poprawkę:
Kod: Zaznacz cały
int main()
{
float a = 248248248248248248248.0;
float b = a/2;
printf("%f",b);
}
Program skompiluje się, float ma większy zakres niż int, ale po uruchomieniu programu otrzymasz
\(\displaystyle{ 124124122746330284032.000000}\), czego (błędu) można było się spodziewać.
Korzystając z kalkulatora wielkich liczb (wygoogluj taki kalkulator online) przeprowadź kilka testów korzystając z kodu
Kod: Zaznacz cały
#include <iostream>
#include <cmath>
int main()
{
float a = 15159303447561417273129.0;
float b = sqrt(a);
printf("%f",b);
}
Zauważysz, że dla dużych liczb wynik jest zawsze całkowity. Wynika to oczywiście z błędu precyzji. Mimo to, możesz wykorzystać wnioski analizy do zbudowania proponowanego przez ciebie zakresu poszukiwań.
Innym, mniej praktycznym, ale o lepszym podłożu teoretycznym sposobem wyznaczania takiego zakresu jest wykorzystanie metody Newtona-Raphsona do poszukiwania przybliżonego pierwiastka z liczby.