• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program obcina liczby po przecinku, niezależnie od typu zmiennej

VPS Starter Arubacloud
0 głosów
2,930 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez Mick_SQ6IYV Obywatel (1,020 p.)
Witam!

Ostatnio mój kompilator zbzikował: niezależnie od tego, czy dana liczba jest typu float czy double - jest wyświetlana jako int. Wszystkie cyfry razem z przecinkiem są skutecznie ukrywane przez program. A przecież nie każdy iloraz dwóch intów jest intem. Dodam, że wyświetlanie stałych matematycznych z biblioteki standardowej idzie programowi wyśmienicie.

Czy ma ktoś pomysł co może być nie tak?? Pozdrawiam!
komentarz 21 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
przeniesione 21 listopada 2017 przez Arkadiusz Waluk
Może kod dasz :V
komentarz 21 listopada 2017 przez Mick_SQ6IYV Obywatel (1,020 p.)
przeniesione 21 listopada 2017 przez Eryk Andrzejewski
#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;


float r, A;
double q, B;
int m, n, p, C;

int main()
{
	for(;;)
	{
		A=M_PI;
		B=M_PI;
		C=M_PI;
		system("cls");
		cout << endl << " Podaj mi dwie liczby naturalne: ";
		cin >> m >> n;
		cout << endl << " Podano liczby: " << m << " oraz " << n << "." << endl;
		if (m<=n)
		{
			q=(n/m);
			p=(n/m);
			r=(n/m);
			cout << endl << " Dzielenie typu float:\t" << r;
			cout << endl << " Dzielenie typu double:\t" << q;
			cout << endl << " Dzielenie typu int:\t" << p;
			cout << endl << endl << " Czekam na dalsze instrukcje.";
		}
		else if (n<=m)
		{
			q=(m/n);
			p=(m/n);
			r=(m/n);
			cout << endl << " Dzielenie typu float:\t" << r;
			cout << endl << " Dzielenie typu double:\t" << q;
			cout << endl << " Dzielenie typu int:\t" << p;
			cout << endl << endl << " Czekam na dalsze instrukcje.";
		}
		cout << endl << endl << endl << " :) " << endl << endl;
		cout << " Liczba pi wynosi: " << A << " (typ float)" << endl;
		cout << " Liczba pi wynosi: " << B << " (typ double)" << endl;
		cout << " Liczba pi wynosi: " << C << " (typ int)" << endl;
		cout << endl << endl << endl << " :) " << endl << endl;
		system("pause");
	}
	return 0;
}

 

komentarz 21 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Proszę treści dotyczące typowo samego pytania (nie żadne odpowiedzi) umieszczać w treści samego pytania (można używać edycji pytania) lub w komentarzach do pytania. Sekcja odpowiedzi, jak sama nazwa wskazuje, służy do udzielania odpowiedzi. Dzięki temu możemy zadbać o porządek na forum smiley

1 odpowiedź

+1 głos
odpowiedź 21 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
q=(m/n);

Zmienne m i n to inty. Dzielisz inta przez inta, więc nie dziwota, że wychodzi Ci liczba całkowita. Możesz użyć rzutowania:

q = (m / static_cast<float>(n));

Możesz zrzutować też oba operandy, lub tylko licznik. Ważne, żeby jeden z operandów był typem zmiennoprzecinkowym, wtedy dopiero wykona się dzielenie zmiennoprzecinkowe.

Ale najłatwiej byłoby po prostu, aby zmienne m i n były zmiennymi zmiennoprzecinkowymi (float, double i tak dalej).

komentarz 21 listopada 2017 przez Mick_SQ6IYV Obywatel (1,020 p.)
przywrócone 21 listopada 2017 przez Mick_SQ6IYV

Oba sposoby pomogły, dziękuję smiley

 

Swoją drogą widać, że myśli moje nie zawsze są myślami kompilatora laugh

 

komentarz 21 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Nie ma problemu. Jak coś to ukryłem twoją odpowiedź, napisałeś tam to samo co tutaj. Rozumiem, że można zamykać?
komentarz 21 listopada 2017 przez manjaro Nałogowiec (37,390 p.)

Dzielisz inta przez inta, więc nie dziwota, że wychodzi Ci liczba całkowita.

Akurat z matematycznego punktu widzenia to dziwota ;) Bo co ma piernik do wiatraka. Iloraz liczb całkowitych nie musi dawać wyniku całkowitego więc każdy ma prawo się dziwić ;) Tym bardziej że informujemy kompilator że ma się spodziewać w wyniku zmiennej typu float ;)

Swego czasu też nie mogłem tego pojąć, w sumie do dziś nie pojmuje. Po prostu przyjmuję że w C++ tak jest i już ;)

komentarz 21 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Domyślam się, że przyczyna tego leży w procesorze. Takie instrukcje jak: add, sub, mul, div działają na liczbach całkowitych. Jeśli chcemy operować na liczbach zmiennoprzecinkowych, służy do tego koprocesor. A owa jednostka zmiennoprzecinkowa jest pewnie angażowana dopiero wtedy, gdy operandy są liczbami zmiennoprzecinkowymi. smiley

Może jest w tym głębszy sens, niż moje rozumowania - w każdym razie jest to ciekawy temat do poczytania.

Podobne pytania

0 głosów
1 odpowiedź 413 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
1 odpowiedź 360 wizyt
+1 głos
1 odpowiedź 3,437 wizyt
pytanie zadane 4 sierpnia 2016 w C# przez hallyu Początkujący (370 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...