Float Division и неявный раунд

Я обнаружил странное поведение в написанном мной фрагменте кода, которого не происходит, когда я пытаюсь воспроизвести его вне программы (т.е. с помощью MATLAB).

Я делаю операцию над массивом следующим образом:

a[i] = a[i] / (sqrt(b[i]) * sqrt(c[i]));

где a, b и c — массивы типа float. Значения a, b и c предыдущего деления находятся в диапазоне от 2000 до 6000000.

Результат операции равен нулю для всех элементов массива, но если смотреть на значения числителя и знаменателя отдельно, то для данного элемента операция 89509.0 / 90240,375 что равно 0,991895258.

Итак, мне интересно, почему полная работа внутри программы с использованием float не работает, а отдельно работает как положено. Вероятно, из-за часов запутанной отладки?


person pQB    schedule 09.10.2012    source источник
comment
Какой тип данных a? float[]?   -  person slugonamission    schedule 09.10.2012
comment
Вы не дали нам достаточно информации, чтобы помочь решить вашу проблему. Каковы значения a[i], b[i] и c[i] до деления? Запускали ли вы свою программу с помощью отладчика?   -  person David Hammen    schedule 09.10.2012
comment
Просто догадываюсь, но я подозреваю, что где-то здесь происходит преобразование в целое число.   -  person John Dibling    schedule 09.10.2012
comment
@slugonamission a,b,c — это массивы с плавающей запятой.   -  person pQB    schedule 10.10.2012
comment
@DavidHammen убедитесь, что я запускаю отладчик, прежде чем спрашивать в SO. я обновил вопрос   -  person pQB    schedule 10.10.2012


Ответы (1)


Когда я сталкиваюсь с похожей ситуацией, я обнаруживаю, что часто бывает полезно разбить ее на шаги и посмотреть, какие шаги ведут себя правильно, а какие нет. Например, для этого его можно разбить на следующее:

float sqrtb = sqrt(b[i]);
float sqrtc = sqrt(c[i]);
float divisor = srqtb * sqrtc;
float dividend = a[i];
float quotient = dividend / divisor;
a[i] = quotient;

Теперь я могу просмотреть каждый элемент и посмотреть, где он терпит неудачу (если он терпит неудачу). Дело в том, что когда я делаю это, я часто обнаруживаю проблему при создании шагов, а затем исправляю ее.

person Joel Rondeau    schedule 09.10.2012
comment
Хороший совет. Наверное, я бы тоже так поступил. - person John Dibling; 09.10.2012
comment
Что удивительно, что я следую вашему предложению и результаты правильные, но не тогда, когда я запускаю всю операцию в строке. - person pQB; 10.10.2012
comment
Я буду исследовать это дальше, но правда в том, что описанная вами работа также помогла мне подтвердить промежуточные результаты. - person pQB; 10.10.2012