Деление и округление ......
Проблема такая :
есть 2 компа (оба селики 300) и на них моя прога работает по разному. После долгих мучений я пришел к выводу что на них по разному выполняеться операция деления и округления в функции поиска по по массиву. В выражении участвуют переменные типа int с последующим приведением к нему же:
i+=(int)((t2-t1)/2.0+.5);
Внимание вопрос! как мне от этого глюка избавиться ?
Может я конечно могу ошибаться в причине, поэтому кто сталкивался с подобными вещами помогите плз.
Я такого раньше не видел !!!
Во-первых если переменные t1 и t2 целочисленные, зачем вообще связываться с вещественными числами. Чем хуже:
i += (t2 - t1) >> 1;
Почему не работает i+=(int)((t2-t1)/2.0+.5) ?
Сложно сказать.
Возможно при нечетной разности значение выражения получается очень близким к целому, но не целым. Преобразование таких вещественных значений к целочисленому типу может давать результаты отличающиеся на единицу. С этим трудно что-то поделать.
А компилятор случайно не BC 3.1 ? Арифметика у него может глючить самым невообразимым образом. Если да, попробуй разбей выражение на несколько частей, обычно помогает.
Sli
Во-первых если переменные t1 и t2 целочисленные, зачем вообще связываться с вещественными числами. Чем хуже:
i += (t2 - t1) >> 1;
Я посмотрел что сгенерил компилятор, вроде все так как и должно быть, только он не делит на 2 а умножает на 0.5 . А со сдвигом не все так просто, нужно отслеживать тот бит который теряеться т.к. нужно округлять к ближайшему целому (я уже так и сделал ).
Смог симитировать ошибку. никогда бы не подумал что запрос в БД (Oracle) с упорядочиванием может по разному возвращать данные на разных компах.