float a=1.0;
for(int b=0;b<10;b++)
a+=0.1f;
if(a==2.0)
cout<<"a is 2";
Стравнение float'ов
Не могу с помощью if'а сравнивать значение переменной типа float:
Код:
И вот то самое последнее сообщение не высвечеваеться :( . Всякие цхищрения, вроде записи 1.0f, замены float на double, и прочее не помогли. Что делать? Операция вроде банальная, но...
навскидку сразу видно: проверка происходит только после выхода из цикла, когда значение а уже 2.1
Цитата:
навскидку сразу видно: проверка происходит только после выхода из цикла, когда значение а уже 2.1
Нет, в этом плане все правильно а=2.0 как раз
Цитата:
Нет, в этом плане все правильно а=2.0 как раз
Неее... Нифига подобного! Про это уже кучу раз писали, 0.3 в двоичной системе-дробь периодическая, и сравнивать надо поэтому примерно так:
Код:
if((a-2.0)<1e-5) cout<<"a is 2";
Код:
#include <iostream>
using namespace std;
int main() {
float a = 1.0;
cout.precision(20);
int b = 10;
for(; b--; ) {
cout << "a is " << a << endl;
a += 0.1f;
}
cout << endl <<"a is " << a << endl;
return 0;
}
using namespace std;
int main() {
float a = 1.0;
cout.precision(20);
int b = 10;
for(; b--; ) {
cout << "a is " << a << endl;
a += 0.1f;
}
cout << endl <<"a is " << a << endl;
return 0;
}
выдает:
Код:
./fl
a is 1
a is 1.1000000238418579102
a is 1.2000000476837158203
a is 1.3000000715255737305
a is 1.4000000953674316406
a is 1.5000001192092895508
a is 1.6000001430511474609
a is 1.7000001668930053711
a is 1.8000001907348632812
a is 1.9000002145767211914
a is 2.0000002384185791016
a is 1
a is 1.1000000238418579102
a is 1.2000000476837158203
a is 1.3000000715255737305
a is 1.4000000953674316406
a is 1.5000001192092895508
a is 1.6000001430511474609
a is 1.7000001668930053711
a is 1.8000001907348632812
a is 1.9000002145767211914
a is 2.0000002384185791016
2.0000002384185791016 == 2.0
Надёжней использовать double, также константы можно инициализировать "длинными" значениями (с суффиксом L)
Код:
[SIZE=2][COLOR=#0000ff]float[/COLOR][/SIZE][SIZE=2] a = 1.0;[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] b=0; b<10; b++)[/SIZE]
[SIZE=2] a += 0.1f;[/SIZE]
[SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][SIZE=2](([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2])a == 2)[/SIZE]
[SIZE=2] cout << "a is 2";[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] b=0; b<10; b++)[/SIZE]
[SIZE=2] a += 0.1f;[/SIZE]
[SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][SIZE=2](([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2])a == 2)[/SIZE]
[SIZE=2] cout << "a is 2";[/SIZE]
Цитата: el scorpio
Походу, глюк с float.
Надёжней использовать double, также константы можно инициализировать "длинными" значениями (с суффиксом L)
Надёжней использовать double, также константы можно инициализировать "длинными" значениями (с суффиксом L)
Какой глюк?
Этот вопрос уже жёван - пережёван где только можно...
Если нужны ссылки на rsdn в поиске посмотрите...
Цитата: Hydra
Код:
if((a-2.0)<1e-5)
ЭТО ЕДИНСТВЕННЫЙ ВЕРНЫЙ СПОСОБ СРАВНЕНИЯ ВЕЩЕСТВЕННЫХ ЧИСЕЛ. ЗАПОМНИТЕ РАЗ И НАВЕГДА.
Цитата: Alexandoros
ЭТО ЕДИНСТВЕННЫЙ ВЕРНЫЙ СПОСОБ СРАВНЕНИЯ ВЕЩЕСТВЕННЫХ ЧИСЕЛ. ЗАПОМНИТЕ РАЗ И НАВЕГДА.
Да, это помогло. Спасибо!