double x[100];
int i;
for (i=0;i<100;i++)
x[i]=-1+i*0.02;
На очередном шаге вышеприведенного алгоритма x[i] должен по идее превратиться в ноль, но под 6-м билдером этого не происходит, в watche отображается страшнейшее число с с экпонентой в минус 61 степени (что-то типа того), кстати под VC 6.0 все нормально. Не подскажите в чем могут быть грабли?? Спасибо!
[C++] вещественные переменные и 6-й builder06.05.03 19:19 Автор: Cyril <sc> Статус: Member
> double x[100]; > int i; > for (i=0;i<100;i++) > x[i]=-1+i*0.02; > > На очередном шаге вышеприведенного алгоритма x[i] должен по > идее превратиться в ноль, но под 6-м билдером этого не > происходит, в watche отображается страшнейшее число с с > экпонентой в минус 61 степени (что-то типа того), кстати > под VC 6.0 все нормально. Не подскажите в чем могут быть > грабли?? Спасибо!
Если есть желание разобраться почему так происходить
сходи по ссылке
> double x[100]; > int i; > for (i=0;i<100;i++) > x[i]=-1+i*0.02; > > На очередном шаге вышеприведенного алгоритма x[i] должен по > идее превратиться в ноль, но под 6-м билдером этого не > происходит, в watche отображается страшнейшее число с с > экпонентой в минус 61 степени (что-то типа того), кстати > под VC 6.0 все нормально. Не подскажите в чем могут быть > грабли?? Спасибо! Не может быть чтоб VC при сравнении такого числа с 0f возвращал true. Вообще при работе с вещественными числами принято не сравнивать с конкретным числом, а учитывать только некоторую точность. Например в данном случае можно делать не
if (x[i] == 0)
а
if (fabs(x[i]) < 1e-30)
[C++] вещественные переменные и 6-й builder06.05.03 23:05 Автор: paulm Статус: Незарегистрированный пользователь
Под VC++ не все нормально, а отрабатывает округление в окне watch.
Если вычисляется значение выражения, а не смотрится переменная, то возможны вообще чудеса. Однажды видел картину маслом: в трех местах отладчика VC++ (watch, всплывающий evaluate и, по-моему, immediate) было ТРИ разных значения одного и того-же выражения, отличающиеся на 2 порядка. А программа писала в файл четвертое :-) Как показало расследование все оказалось просто: выражение было численно неустойчиво и результат зависел от последовательности сложений/вычитаний и умножений/делений и вылечился вставкой избыточных скобок. Но картинка была прямо как в анекдоте: "Проверено. Мин нет. Минер Вася."