Pętla nie zawsza zadziała

0

Witam

#include <iostream>
using namespace std;
int main() {

int i;
cin >> i;
float x = i;
while (x < (float)(i + 16)
cout << x << endl;
x++ ;
}
return 0;
}

Czy może się zdarzyć, że pętla będzie nieskończona lub program nic nie wypisze? Dlaczego?

0

float najpewniej ma taki sam rozmiar jak int, w sensie liczby bajtów. Ale float nie wszystkie bity przeznazcza na "cyfry wiodące". To oznacza że gdybyś wziął dużego inta, który ma więcej cyfr wiodących niż float może przechować, to taki int wpisany do zmiennej float będzie paradoksalnie mniejszy niż int.

2

Twój kod się nie kompiluje.

Po poprawieniu błędów kompilacji można zauważyć, że operujesz na liczbach zmiennoprzecinkowych. Na popularnych architekturach float ma 32 bity, gdzie 1 bit to znak, 8 to cecha, a 23 to mantysa. Oznacza to, że może dokładnie reprezentować tylko 225+1 kolejnych liczb całkowitych [-224, 224], i ani jednej więcej. Inaczej mówiąc, na typowej architekturze, poniższe jest prawdziwe:

float f = 16777216; // 2^24
f == f + 1;
1

Co to za plaga? To już któryś temat, gdzie ktoś żywcem przepisuje zadanie szkolne/akademickie na tym forum, myśląc, że ktoś mu je po prostu rozwiąże.

Nie chce mi się liczyć tego, a że jak widzę tobie też się nie chce, to nie widzę cienia powodu, dla którego mnie ma się chcieć bardziej.

W każdym razie tak, cuda mogą się dziać, gdy i będzie tak duże, że ta wartość nie będzie mogła być dokładnie przedstawiona w typie float. Czy taka sytuacja może się zdarzyć, zależy od dokładnych rozmiarów tych danych.

https://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa

https://en.wikipedia.org/wiki/Floating-point_arithmetic

http://en.cppreference.com/w/cpp/language/types

Materiał rozszerzający: https://uva.onlinejudge.org/external/float-in-competition.pdf

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