Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Стравнение float'ов

3.7K
05 декабря 2006 года
Techtor
43 / / 12.09.2004
Люди, помогите!
Не могу с помощью if'а сравнивать значение переменной типа float:
 
Код:
float a=1.0;

    for(int b=0;b<10;b++)
        a+=0.1f;

    if(a==2.0)
        cout<<"a is 2";

И вот то самое последнее сообщение не высвечеваеться :( . Всякие цхищрения, вроде записи 1.0f, замены float на double, и прочее не помогли. Что делать? Операция вроде банальная, но...
5.4K
06 декабря 2006 года
Svyatozar
221 / / 11.09.2006
навскидку сразу видно: проверка происходит только после выхода из цикла, когда значение а уже 2.1
274
06 декабря 2006 года
Lone Wolf
1.3K / / 26.11.2006
Интерестно. "шаманский бубуен" ,млин попробывал пошаманить, типа ((a-2.0)==0), тоже не помогает
Цитата:
навскидку сразу видно: проверка происходит только после выхода из цикла, когда значение а уже 2.1


Нет, в этом плане все правильно а=2.0 как раз

547
06 декабря 2006 года
Hydra
488 / / 20.06.2006
Цитата:

Нет, в этом плане все правильно а=2.0 как раз


Неее... Нифига подобного! Про это уже кучу раз писали, 0.3 в двоичной системе-дробь периодическая, и сравнивать надо поэтому примерно так:

 
Код:
if((a-2.0)<1e-5) cout<<"a is 2";
5.4K
06 декабря 2006 года
Svyatozar
221 / / 11.09.2006
интересное наблюдение:
Код:
#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;
}

выдает:
Код:
./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
6.4K
06 декабря 2006 года
Host
122 / / 22.09.2005
Интересно, когда выражение вернет true?

2.0000002384185791016 == 2.0
309
06 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
Походу, глюк с float.
Надёжней использовать double, также константы можно инициализировать "длинными" значениями (с суффиксом L)
1.8K
06 декабря 2006 года
k3Eahn
365 / / 19.12.2005
Можно сделать так (для сравнения с числом конечной точности):
 
Код:
[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]
20K
06 декабря 2006 года
Ich
18 / / 02.10.2006
Цитата: el scorpio
Походу, глюк с float.
Надёжней использовать double, также константы можно инициализировать "длинными" значениями (с суффиксом L)





Какой глюк?
Этот вопрос уже жёван - пережёван где только можно...
Если нужны ссылки на rsdn в поиске посмотрите...

398
07 декабря 2006 года
Alexandoros
630 / / 21.10.2005
Цитата: Hydra

 
Код:
if((a-2.0)<1e-5)



ЭТО ЕДИНСТВЕННЫЙ ВЕРНЫЙ СПОСОБ СРАВНЕНИЯ ВЕЩЕСТВЕННЫХ ЧИСЕЛ. ЗАПОМНИТЕ РАЗ И НАВЕГДА.

3.7K
09 декабря 2006 года
Techtor
43 / / 12.09.2004
Цитата: Alexandoros
ЭТО ЕДИНСТВЕННЫЙ ВЕРНЫЙ СПОСОБ СРАВНЕНИЯ ВЕЩЕСТВЕННЫХ ЧИСЕЛ. ЗАПОМНИТЕ РАЗ И НАВЕГДА.



Да, это помогло. Спасибо!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог