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

pętla for oraz if(1000==1000) zwraca fałsz?!

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
308 wizyt
pytanie zadane 21 stycznia 2017 w C i C++ przez rattle Użytkownik (510 p.)
edycja 21 stycznia 2017 przez rattle
#include <iostream>
using namespace std;
int main(void) {
    float a;
    for(a = 0.01; a < 100; a=a*10){
       cout<<"a: "<<a<<"  < - >  ";

       if(a<100) cout<<"a<100"<<endl;

       if(a==100) cout<<"a==100"<<endl;

    }
    cout<<"a jest rowne tyle: "<<a<<endl;
    if(a!=1000) cout<<"a!=1000"<<endl;
//if(a==1000) cout<<"a==1000"<<endl;
//wypisuje ze a jest rowne 1000 ale chwile potem nie jest?!

    return 0;
}

?!

plx help me, bo mi mózg eksloduje. jak to jest możliwe to co tu się dzieje.

Edit: ten przykład z 1000 zrobiłem po to żeby pokazać, że coś tu jest nie tak tylko nie wiem co. Po skończeniu pętli a jest równe 1000, ponieważ pętla jakimś cudem wykonała się dla 100 tzn. gdy ostatni raz był sprawdzany warunek środkowy pętli for czyli " a < 100; " to wyszło, że to prawda i pętla wykonała się jeszcze raz. I to mnie właśnie powiesiło. Dlaczego pętla wykonała się dla 100 skoro warunek jest oczywisty, że wykonuje się dla wartości mniejszych od 100.

Dla przykładu to tak jakbym miał for(int i=0; i<1; i++) i wykonało by się dwa razy tzn. pętla by się wykonała dla 0 i dla 1. A nie wykonuej się prawda?

komentarz 21 stycznia 2017 przez Magicone Nałogowiec (45,100 p.)
Ayy, pętla kończy się na wartości 100 iteratora, tj. zmienna a po skończeniu pętli to nie 1000, tylko 100.
komentarz 21 stycznia 2017 przez Dorion300 Szeryf (90,250 p.)
@Magicone   Tak?

A dlaczego wypisuje że "a jest równe tyle: 1000"? Jak to wyjaśnisz?
komentarz 21 stycznia 2017 przez Adii Użytkownik (960 p.)
for(int a=0.1; a <=100; a=a*10) {}

Twój zapis powodował, że program wychodził z pętli przez to, że warunek był niespełniony. 

1 odpowiedź

+2 głosów
odpowiedź 21 stycznia 2017 przez erx700 Gaduła (3,430 p.)
wybrane 21 stycznia 2017 przez rattle
 
Najlepsza
Ponieważ liczba jest zapisywana w systemie dwójkowym to 0.1 po konwersji jest ułamkiem nieskończonym i pomnożenie przez 10 nie daje idealnego 1 tylko jakiś ułamek, ale cout chce być przyjazny użytkownikom dlatego ładnie zaokrągla liczbę. Końcowa liczba tysiąc nie jest tak naprawdę idealnym tysiącem.
komentarz 21 stycznia 2017 przez rattle Użytkownik (510 p.)
#include <iostream>
using namespace std;
int main(void) {
    float a;
    for(a = 0.01; a < 100; a *= 10){
        cout<<"a: "<<fixed<<a<<endl;

    }
    return 0;
}

O tak już chyba rozumiem. Dzięki za naprowadzenie. Wystarczy dodać fixed i już widać różnice. Ale jak tak teraz na to patrze to ten typ float jakiś dziwny jest. Bo to już nawet nie chodzi o mnożenie tylko wystarczy zapisać zwykłe 0.1 w floacie i wypisać jako fixed i już widać, że to nie 0.1

komentarz 21 stycznia 2017 przez unknown Nałogowiec (39,560 p.)

Ale jak tak teraz na to patrze to ten typ float jakiś dziwny jest.

Poczytaj o standardzie IEEE754

komentarz 21 stycznia 2017 przez erx700 Gaduła (3,430 p.)
Dlatego lepiej nie przechowywać informacji w float tylko w int, a jedynie przy wyświetlaniu odpowiednio podzielić aby wyglądało to jak ułamek.
komentarz 21 stycznia 2017 przez niezalogowany
edycja 21 stycznia 2017

Czy jest jakiś sposób, żeby mnożyć takie liczby i uzyskać poprawny wynik? Czy można to zrobić tylko z użyciem np. instrukcji warunkowej w taki sposób?

for (;  a < 1000; ) {
	if (b == 9) {
		a++;
		b = 0;
	}
	else b++;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 2,422 wizyt
pytanie zadane 27 listopada 2017 w Inne języki przez Misiek Mądrala (5,320 p.)
0 głosów
0 odpowiedzi 871 wizyt
pytanie zadane 1 stycznia 2022 w C i C++ przez Admak Początkujący (340 p.)
0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 5 stycznia 2020 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)

93,115 zapytań

142,097 odpowiedzi

321,677 komentarzy

62,453 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...