在C ++ / iOS中更改默认除以0的行为

时间:2014-04-26 15:57:46

标签: c++ ios arm clang divide-by-zero

我正在构建一个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?一位教授告诉我,这是一个硬件/架构问题而且没有办法实现,但我想知道是否可能不是这样。感谢您的任何答案/想法/建议。

2 个答案:

答案 0 :(得分:2)

就像艾伦·斯托克斯所提到的那样,你无法有效地改变如何处理零除法。

但是根据您正在使用的值的语义和范围,可能会提升和/或缩放您的输入,以便不会留下0。

编辑: 通过语义,我的意思是相关摄像机实际产生的值范围。许多数码相机实际上无法产生完整的RGB范围。如果没有,您可以使用该信息将输入转移到所需范围。

如果您没有这种信息,或者您的相机确实产生了(0,0,0) - (255,255,255),另一种选择是促进您对浮动的输入和移位和/或缩放按照那种格式的要求。这将需要更多的计算,但可能比失败的分支预测更便宜。在做出最终决定之前,一定要测量对代表性输入样本的影响。

答案 1 :(得分:1)

不,你不能。它由浮点规范指定并在硬件中实现。