• 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

0 głosów
578 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez Mick_SQ6IYV Użytkownik (730 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 (38,050 p.)
przeniesione 21 listopada 2017 przez Arkadiusz Waluk
Może kod dasz :V
komentarz 21 listopada 2017 przez Mick_SQ6IYV Użytkownik (730 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 (154,160 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 (154,160 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 Użytkownik (730 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 (154,160 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 (28,680 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 (154,160 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ź 99 wizyt
0 głosów
1 odpowiedź 772 wizyt
pytanie zadane 4 sierpnia 2016 w C# i .NET przez hallyu Początkujący (360 p.)
0 głosów
1 odpowiedź 64 wizyt
pytanie zadane 27 czerwca 2018 w C# i .NET przez DODO Bywalec (2,870 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

62,276 zapytań

108,403 odpowiedzi

226,291 komentarzy

34,909 pasjonatów

Przeglądających: 228
Pasjonatów: 10 Gości: 218

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...