проверка значения double

Тема в разделе "LANGS.C", создана пользователем cupuyc, 19 дек 2009.

  1. cupuyc

    cupuyc New Member

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

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Не бред, а NAN. std::numeric_limits::quiet_NaN() ?
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Перед взятием корня надо проводить проверку. А не после.
     
  4. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    std нету. это для микроконтроллера - там вообще никаких либ нету. так что нужно как-то через велосипед.

    это если нужно взять корень один раз. а енсли выражение на 3 страница - перед каждым взятием корня, арксинуса и пр. делать проверку? слишком накладно получается.
     
  5. _DEN_

    _DEN_ DEN

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

    Значит курить доки по микроконтроллеру - как реализовывается float-point арифметика, есть ли там поняние NaN (Not a Number), и поддерживает ли это все компилятор.
     
  6. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    cupuyc
    флоат пойнт не в железе? корень и прочее рядами? начальная проверка даже не заметна будет. сколько она? 1-2 лишних такта?
     
  7. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Это проверено многолетней программистской практикой : лучше лишний раз проверить, чем потом искать ошибку.
    Тем более я не понимаю : до проверять дорого, а после дешево ???
    Самое интересное, идея вычислять "аппаратно" стандартные функции себя изжила. Тут недавно искал потерянный бит в вычислениях и с удивлением обнаружил, что Интел в своих библиотеках( версия 8 компилятора) все функции вычисляет через конвеерные команды - быстрее получается !!! А главное математически точно. А вот аппаратные функции врут в последнем бите мантиссы.
     
  8. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    спорный вопрос. например, есть выражение:

    a = arccos(b*b + sqrt(a + c + d * sqrt(h * i - 3) - sqrt(g*k)) / (k + d) - ...

    и так несколько строк. сколько проверок нужно сделать? если же вероятность того, что начальные данные некоректны сотые доли процента, то получается что в 9999 из 10000 раз проверки будут безполезны.
    чтобы обеспечить максимальную производительность нужно в первую очередь всё рассчитывать на удачный исход. в принципе, для этого и служат исключения. ошибка - исключительная ситуация, чтобы не писать миллион условий и не тормозить программу, работающую в штатном режиме.
     
  9. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    cupuyc
    Неправда, не накладно. Одна проверка намного быстрее вычисления корня или синуса. Они, насколько знаю, вычисляются методом рядов, это куча умножений и сложений.
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Тогда уж определись : или у тебя есть исключения, или снижай оптимальность(кстати в производительности и памяти потеряешь доли процента) - получишь нормальную прогу.
    Когда не было ЭВМ, то все серьезные вычисления проводили дважды - так называемый поверочный расчет и были даже методики как его оптимизировать. А вы говорите лишние вычисления. Это копейки.
     
  11. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    блин, для x86, конечно, копейки.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ну дык уже ответили - либо проверять _перед_ исполнением функции.
    Например написать:
    Код (Text):
    1. double _sqrt(double x)
    2. {
    3.     if (x < 0.0)
    4.     {
    5.     // throw exception or jump to error handler
    6.     }
    7.     return sqrt(x);
    8. }
    Либо изучать маны.
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ты все время хитришь! Если сложные выражения, то копейки для любого проца. Если аппаратные функции, то по памяти могут быть варианты, но обычно проверка или эксепшн зашиваются тоже аппаратно. Без конкретики это уже близко к флуду... Особенно в LANG.C
     
  14. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    cupuyc
    Зачем тебе такие сложные выражения? Всё считаешь как ноги паука поворачивать? Если да, то в этой задаче никакого double и близко не нужно, вполне достаточно будет чисел с фиксированной точкой.
     
  15. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    несколько хитрее. уже сделано. можно закрывать.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ну дык поделись твоим вариантом, вдруг пригодится кому-нибудь :)
     
  17. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    да, всё бонально. решил забить на точные вычисления и прошил табличку. функция довольно хорошая, гладкая, так что даже линейной интерполяции вполне достаточно. раньше вычисления занимали 30ms, сейчас, вместе с интерполяцией 0.5 ms.