Кто-нибудь сталкивался с эксепшонами типа C0000090 ?
Как с этим бороться ? Вылезает на ровном месте, причем совершенно непонятно почему.
Пробовал вставлять вызов _control87(_MCW_EM, _MCW_EM) но это не помогает, каким то совершенно непонятным образом флаги сбрасываются в совершенно дикий вид.
В нормальном состоянии флаги такие ControlWord=FFFF027F StatusWord=FFFF0000 TagWord=FFFFFFFF (где бы еще нарыть что это означает.... )
При ошибке флаги CTW=FFFF1370 STW=FFFFFDA1 TGW=FFFFBFFF
Прямо беда.
dbl какой перед сравнением? Наверное, NaN какой-нибудь, да еще и signaling NaN небось? Вставь перед сравнением проверку _finite(dbl) или хотя бы _isnan(dbl).
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Во-первых всё то, что сказал Sergey
а во-вторых сравнение лучше делать так:
if(dbl < 0.0000001){...} //Вместо 0.0000001 можно ставить любую другую точность, которая тебя устраивает
незабудь и возвращаемое MoneyEps() проверить на бесконечность и прочие бяки
я больше причин не вижу
Девиз настоящих студентов: Не боись — ПРОРВЁМСЯ
Re[4]: Как бороться ?
От:
Аноним
Дата:
20.03.02 15:14
Оценка:
Здравствуйте GromRom, Вы писали:
GR>Здравствуйте flyker, Вы писали:
GR>>>Вставь кусочек кода, где(по-твоему) возникает эксепшен
F>>Вот исходник:
F>>char* Intl::PrintMoney(double dbl, char *str, WORD w) F>>{ F>> if( dbl < 0 && dbl > -MoneyEps() ) dbl = 0.0; F>> return PrintFloat(dbl, str, bCurrDigits, w); F>>}
GR>Во-первых всё то, что сказал Sergey GR>а во-вторых сравнение лучше делать так: GR>if(dbl < 0.0000001){...} //Вместо 0.0000001 можно ставить любую другую точность, которая тебя устраивает
GR>незабудь и возвращаемое MoneyEps() проверить на бесконечность и прочие бяки
Ну MoneyEps() возвращает константу, это так к слову...
Понимаете в чем дело, я не могу везде в коде понатыкать эти проверки,
таких мест слишком много. Хотелось бы иметь универсальный метод, при котором
такие исключение вообще бы никогда не возникали.
Собственно функция _control87 вроде бы именно этому и служит.
С ее помощью по идее можно отключить все Float Exceptions.
Здравствуйте Аноним, Вы писали:
А>Здравствуйте GromRom, Вы писали:
GR>>Здравствуйте flyker, Вы писали:
GR>>>>Вставь кусочек кода, где(по-твоему) возникает эксепшен
F>>>Вот исходник:
F>>>char* Intl::PrintMoney(double dbl, char *str, WORD w) F>>>{ F>>> if( dbl < 0 && dbl > -MoneyEps() ) dbl = 0.0; F>>> return PrintFloat(dbl, str, bCurrDigits, w); F>>>}
GR>>Во-первых всё то, что сказал Sergey GR>>а во-вторых сравнение лучше делать так: GR>>if(dbl < 0.0000001){...} //Вместо 0.0000001 можно ставить любую другую точность, которая тебя устраивает
GR>>незабудь и возвращаемое MoneyEps() проверить на бесконечность и прочие бяки
А>Ну MoneyEps() возвращает константу, это так к слову... А>Понимаете в чем дело, я не могу везде в коде понатыкать эти проверки, А>таких мест слишком много. Хотелось бы иметь универсальный метод, при котором А>такие исключение вообще бы никогда не возникали. А>Собственно функция _control87 вроде бы именно этому и служит. А>С ее помощью по идее можно отключить все Float Exceptions.
Не, не все. signaling NaN на то и signaling, что фиг отключишь. А кроме того, подумай — тебя ж бугалтеры (или кто там у тебя заказчики) не поймут, если у тебя вместо денег всякие #INF печататься будут. Представь себе — бесконечно много денег А проверять надо, когда на 0 делишь ну и входные данные, при печати это делать поздно. Опять же, результат сравнения числа с quit NaN зависит от порядка операторов — есть где багов половить, а? Так что ексепшны отключать зачастую себе дороже.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Как бороться ?
От:
Аноним
Дата:
20.03.02 15:58
Оценка:
Здравствуйте Sergey, Вы писали:
S>Здравствуйте Аноним, Вы писали:
А>>Здравствуйте GromRom, Вы писали:
GR>>>Здравствуйте flyker, Вы писали:
GR>>>>>Вставь кусочек кода, где(по-твоему) возникает эксепшен
F>>>>Вот исходник:
F>>>>char* Intl::PrintMoney(double dbl, char *str, WORD w) F>>>>{ F>>>> if( dbl < 0 && dbl > -MoneyEps() ) dbl = 0.0; F>>>> return PrintFloat(dbl, str, bCurrDigits, w); F>>>>}
GR>>>Во-первых всё то, что сказал Sergey GR>>>а во-вторых сравнение лучше делать так: GR>>>if(dbl < 0.0000001){...} //Вместо 0.0000001 можно ставить любую другую точность, которая тебя устраивает
GR>>>незабудь и возвращаемое MoneyEps() проверить на бесконечность и прочие бяки
А>>Ну MoneyEps() возвращает константу, это так к слову... А>>Понимаете в чем дело, я не могу везде в коде понатыкать эти проверки, А>>таких мест слишком много. Хотелось бы иметь универсальный метод, при котором А>>такие исключение вообще бы никогда не возникали. А>>Собственно функция _control87 вроде бы именно этому и служит. А>>С ее помощью по идее можно отключить все Float Exceptions.
S> Не, не все. signaling NaN на то и signaling, что фиг отключишь. А кроме того, подумай — тебя ж бугалтеры (или кто там у тебя заказчики) не поймут, если у тебя вместо денег всякие #INF печататься будут. Представь себе — бесконечно много денег :)) А проверять надо, когда на 0 делишь ну и входные данные, при печати это делать поздно. Опять же, результат сравнения числа с quit NaN зависит от порядка операторов — есть где багов половить, а? Так что ексепшны отключать зачастую себе дороже.
В общем понятно, придется ловить багу :( не отвертется
Спасибо :user: