не могу сообразить - как проверить значение переменной типа double на валидность? ну, например, извлекли мы корень из какого-то выражения, которое было отрицательным, получили в переменной некий бред. как этот бред можно отличить от валидного значения?
std нету. это для микроконтроллера - там вообще никаких либ нету. так что нужно как-то через велосипед. это если нужно взять корень один раз. а енсли выражение на 3 страница - перед каждым взятием корня, арксинуса и пр. делать проверку? слишком накладно получается.
cupuyc Значит курить доки по микроконтроллеру - как реализовывается float-point арифметика, есть ли там поняние NaN (Not a Number), и поддерживает ли это все компилятор.
cupuyc флоат пойнт не в железе? корень и прочее рядами? начальная проверка даже не заметна будет. сколько она? 1-2 лишних такта?
Это проверено многолетней программистской практикой : лучше лишний раз проверить, чем потом искать ошибку. Тем более я не понимаю : до проверять дорого, а после дешево ??? Самое интересное, идея вычислять "аппаратно" стандартные функции себя изжила. Тут недавно искал потерянный бит в вычислениях и с удивлением обнаружил, что Интел в своих библиотеках( версия 8 компилятора) все функции вычисляет через конвеерные команды - быстрее получается !!! А главное математически точно. А вот аппаратные функции врут в последнем бите мантиссы.
спорный вопрос. например, есть выражение: a = arccos(b*b + sqrt(a + c + d * sqrt(h * i - 3) - sqrt(g*k)) / (k + d) - ... и так несколько строк. сколько проверок нужно сделать? если же вероятность того, что начальные данные некоректны сотые доли процента, то получается что в 9999 из 10000 раз проверки будут безполезны. чтобы обеспечить максимальную производительность нужно в первую очередь всё рассчитывать на удачный исход. в принципе, для этого и служат исключения. ошибка - исключительная ситуация, чтобы не писать миллион условий и не тормозить программу, работающую в штатном режиме.
cupuyc Неправда, не накладно. Одна проверка намного быстрее вычисления корня или синуса. Они, насколько знаю, вычисляются методом рядов, это куча умножений и сложений.
Тогда уж определись : или у тебя есть исключения, или снижай оптимальность(кстати в производительности и памяти потеряешь доли процента) - получишь нормальную прогу. Когда не было ЭВМ, то все серьезные вычисления проводили дважды - так называемый поверочный расчет и были даже методики как его оптимизировать. А вы говорите лишние вычисления. Это копейки.
ну дык уже ответили - либо проверять _перед_ исполнением функции. Например написать: Код (Text): double _sqrt(double x) { if (x < 0.0) { // throw exception or jump to error handler } return sqrt(x); } Либо изучать маны.
Ты все время хитришь! Если сложные выражения, то копейки для любого проца. Если аппаратные функции, то по памяти могут быть варианты, но обычно проверка или эксепшн зашиваются тоже аппаратно. Без конкретики это уже близко к флуду... Особенно в LANG.C
cupuyc Зачем тебе такие сложные выражения? Всё считаешь как ноги паука поворачивать? Если да, то в этой задаче никакого double и близко не нужно, вполне достаточно будет чисел с фиксированной точкой.
да, всё бонально. решил забить на точные вычисления и прошил табличку. функция довольно хорошая, гладкая, так что даже линейной интерполяции вполне достаточно. раньше вычисления занимали 30ms, сейчас, вместе с интерполяцией 0.5 ms.