Porównywanie duzych wartosci w double

0

Witam to znowu ja i kolejny problem niestety.

Dlaczego przy tym kodzie:

 #include <iostream>
using namespace std;
 
int main() {
	// your code goes here
 
	
	double a=9223372036854775807;
	double b=9223372036854775808;
 
	if (b>a) cout << "Wieksze!";
	else cout << "Mniejsze!";
	return 0;
}

Wynikiem jest:

Mniejsze!

Wiem, ze duze liczby double zawsze sa w ktoryms momencie "ucinane" i nawet pomimo przypisania pewnych wartosci w rzeszywistosci moga sie roznic bardzo nieznacznie. Tylko, ze w tym przykladzie nie porownuje dwoch liczb czy sa rowne, a ktora jest wieksza. To chyba nie powinno miec znaczenia juz na tym etapie, czy jednak sie myle?

1

Przekraczasz zakres liczb double (15 cyfr dziesiętnych), dlatego obydwie te liczby są sobie równe.

0

Nie za bardzo rozumiem. Każda liczbę można przedstawić za pomocą określonej liczby bajtów powiedzmy integer to 4 bajty co daje nam 4*8 = 32bity czyli 2^32 <-- najwieksza liczba jaka mozemy zapisac. Double też ma określoną wartość. Można także zapisywać liczby większe dodając long long. Lub jest jeszcze na to inny sposób, podam później linka do kursu jak to zrobić. Nie rozumiem dlaczego tak duże liczby dajesz do double został stworzony ten typ dla liczb zmienno przecinkowych w pamięci zapisywana jest ona w postaci znaku matysy oraz potęgi, nie jest stworzona ona dla takich liczb. przy tak ogromnych liczbach następuje overflow. Jeśli mamy dwie liczby takie zostaną ucięte one do tej samej wartości czyli a=b więc warunek a>b nie zachodzi prawda ;d ?

0

Aaa! Zle odczytalem tabele danych, blednie zalozylem, ze skoro long long int przyjmuje wartosci do 9223372036854775807 to double bedzie mial wiekszy zakres. Dzieki wielkie!

0

double ma większy zakres, ale nie ma takiej precyzji.

typy całkowite (int, long, long long) mają ściśle określony zakres i precyzję zawsze równą 1.
typy zmiennoprzecinkowe (float, double) mają dużo większy zakres, ale im liczba dalej od zera, tym mniejsza dokładność. w pewnym miejscu dokładność przekracza 1 i pojawiają się „dziury”, liczby całkowite niemożliwe do zapisania.

twoje dwie liczby z przykładu są po prostu sobie równe (jeśli mowa o typie double), wyświetliłeś zły komunikat ;-)
spróbuj też te zmienne wyświetlić, zobaczysz że nie wynoszą dokładnie tyle ile byś chciał.

1 użytkowników online, w tym zalogowanych: 0, gości: 1