我正在构建一个iOS应用程序。
我有以下代码:
if(pbCB == 0) { //Don't divide by 0
c = 1;
} else {
c = sqrt(pb / pbCB) * PROTANOPIA_WBP;
}
我真的想摆脱if语句(上面的代码在for循环中)。
我知道将浮点除以0然后将该值转换为unsigned char给出(使用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?一位教授告诉我,这是一个硬件/架构问题而且没有办法实现,但我想知道是否可能不是这样。感谢您的任何答案/想法/建议。
答案 0 :(得分:2)
就像艾伦·斯托克斯所提到的那样,你无法有效地改变如何处理零除法。
但是根据您正在使用的值的语义和范围,可能会提升和/或缩放您的输入,以便不会留下0。
编辑: 通过语义,我的意思是相关摄像机实际产生的值范围。许多数码相机实际上无法产生完整的RGB范围。如果没有,您可以使用该信息将输入转移到所需范围。
如果您没有这种信息,或者您的相机确实产生了(0,0,0) - (255,255,255),另一种选择是促进您对浮动的输入和移位和/或缩放按照那种格式的要求。这将需要更多的计算,但可能比失败的分支预测更便宜。在做出最终决定之前,一定要测量对代表性输入样本的影响。
答案 1 :(得分:1)
不,你不能。它由浮点规范指定并在硬件中实现。