Я создаю приложение для iOS.
У меня есть следующий код:
if(pbCB == 0) { //Don't divide by 0
c = 1;
} else {
c = sqrt(pb / pbCB) * PROTANOPIA_WBP;
}
Я действительно хочу избавиться от оператора if (приведенный выше код находится внутри цикла for).
Я знаю, что выполнение деления с плавающей запятой на 0, а затем приведение этого значения к беззнаковому символу дает (используя gdb для проверки):
//floating-point division by 0
p 10.0/0
$1 = inf
//casted to an unsigned char
p (unsigned char) (10.0/0)
$2 = 0 '\000'
Что мне интересно, так это если есть способ изменить определение деления на 0, чтобы оно возвращало 1? Профессор сказал мне, что это аппаратно-архитектурная проблема, и что нет способа это сделать, но я хотел посмотреть, возможно, это не так. Спасибо за любые ответы / мысли / совет.
Нет, ты не можешь. Это определено спецификацией с плавающей запятой и реализовано в оборудовании.
Как упоминал Алан Стоукс, вы не можете эффективно изменить способ деления на ноль.
Но в зависимости от семантики и диапазонов значений, с которыми вы работаете, может быть возможно поднять и / или масштабировать ваши входы, чтобы не осталось нулей.
РЕДАКТИРОВАТЬ:
Под семантикой я подразумеваю диапазон значений, которые фактически создаются рассматриваемой камерой. Многие цифровые камеры на самом деле не способны воспроизводить полный диапазон RGB. Если это не так, вы можете использовать эту информацию для смещения ваших входов в желаемый диапазон.
Если у вас нет такой информации, или ваша камера действительно выдает (0,0,0) — (255,255,255), другой вариант заключается в переводе ваших входных данных в плавающие и сдвигаемые и / или масштабируемые по желанию в этом формате , Это потребует немного больше вычислений, но это может быть быть дешевле, чем неудачные прогнозы ветвления Обязательно измерьте влияние на репрезентативные входные выборки, прежде чем принимать какие-либо окончательные решения.