Плавающая точка.

Тема в разделе "LANGS.C", создана пользователем qwerty_9876, 15 окт 2007.

  1. qwerty_9876

    qwerty_9876 New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    47
    Здравствуйте!
    Есть код, там происходят вычисления с плавающей точкой, есть там две функции каждая возвращает вектор типа double в этих двух векторах должны содержаться одинаковые значения. Все прекрасно работает в Debug, в Release(если трейсить из студии VC2003), а вот если запустить отдельно бинарь Debug,Release, то значения будут разные отличаться будут на сотые, или на тысячные, или на 10 тысячные.
    Может уже кто сталкивался с этим, как это забарывать.
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    а в каком правильные значения?
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    qwerty_9876

    Никак. Для флоатпоинтов нельзя использовать operator ==
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    если не была сделана инициализация переменной перед её использованием, то результатом может быть та разница о которой идёт речь. В debug и release значения в неинициализированых переменных различаются, в одно случае в переменной сидит ноль - в другом - некоторое ненулевое значение.

    _DEN_

    В каком смысле? Сравнение запрещено?
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Не имеет смысла
     
  6. qwerty_9876

    qwerty_9876 New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    47
    >>если не была сделана инициализация переменной перед её использованием, то результатом может быть та разница >>о которой идёт речь. В debug и release значения в неинициализированых переменных различаются, в одно случае в >>переменной сидит ноль - в другом - некоторое ненулевое значение.

    Угу, в точку. Уже все работает, там, в одном хитром месте действительно забыл занулить память.

    >>Никак. Для флоатпоинтов нельзя использовать operator ==

    Для флоатпоинтов нет, а для unsigned __int64 в случае double, или unsigned int в случае float можно делается так:

    struct DOUBLE_UNION
    {
    union
    {
    double d_;
    unsigned __int64 ullong;
    };
    };

    Как вариант можно использовать еще memcmp.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    qwerty_9876

    Ты не понял. Сравнивать-то можно. Вот только, как верно подметил комрад censored, в этом не будет смысла, как бы ты не сравнивал, напрямую, через union, через memcmp, или как-то еще. Суть в том, что компьютерный float-point может точно описывать только узкий круг вещественных чисел, а именно числа вида A * 2^B, где A и B - целые. Все остальные числа описываются с некоторой ошибкой. А какой смысл проверять два числа на идентичность друг другу, если они сами уже хранят ошибку? Никакого.

    [EDIT]:

    "описываются с некоторой ошибкой" - более точно означает "описываются как ближайшее число вида A * 2^B"