Точность вычислений

Тема в разделе "WASM.BEGINNERS", создана пользователем Pahan, 7 янв 2010.

  1. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    Т.е. иными словами выполнить поиск элемента типа double в массиве - это некорретная задача?
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Pahan
    На мой взгляд тебе нужно прочитать учебник по вычислительной математике.

    А если коротко, то для числа A типа double можешь считать что абсолютная погрешность равна abs(A)*2^-52. Для суммы или разности абсолютная погрешность равна сумме погрешностей операндов. Для произведения или частного относительная погрешность равна сумме относительных погрешностей операндов. А относительную погрешность можно найти как отношение абсолютной погрешности к абсолютному значению операнда.

    А условие из первого сообщения, если считать что все три числа точные, а не результаты других вычислений, можно записать так:
    if (abs((a-b)-c)<abs(a)*2^-52+abs(b)*2^-52+abs(c)*2^-52)
    cout<<"yes" <<endl;
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    http://democoder.ru/article/14?SID=76c64ac959d4f421b58afc0ac4456fd3

    Код (Text):
    1. if (fabs(x - y) < eps * fabs(max(x,y)))
    ну или еще вариант:
    Код (Text):
    1. if (fabs((x - y) / x) < eps)
     
  4. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    Booster
    Да я вообще-то когда это читал. Но вот что это значит на практике только сейчас начал осознавать. Благодаря Вам. Спасибо.
    n0name
    Ссылка битая какая-то. А посмотреть хотелось бы.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    http://democoder.ru/article/14
     
  6. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    отвечаю не открывает: FF, Opera, IE.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Можно очень быстро вычислить eps. Интерпретировать результат как целое, записать в мантиссу 1 и снова интерпретировать как вещественное.
     
  8. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    есть FLT_EPSILON, DBL_EPSILON
     
  9. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Pahan

    Можно также рассмотреть _относительную_ "esp":

    delta_abs=abs(x-y);
    if ( (delta_abs/x < eps) && (delta_abs/y < eps) ) - ну или как-то так.

    Конечно, для быстрых вычислений такое не годицца. Можно относительно быстро сравнить экспоненты или сравнивать x/y с 1...
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    1) Прекрасно все открывается.
    2) Столько говорильни в пустую. Нужно строить алгоритм так, чтобы не нужно было сравнивать или надеятся на точное совпадение. Если нужно позарез - есть арифметика рациональных чисел : в ней все точно и нет проблем с эпсилон. Естественно в ней есть ограничения и по величине и по точности представления. Если нужно супер - берете bignum и на ее основе делаете bigrational.