【发布时间】:2014-04-26 15:57:45
【问题描述】:
我正在构建一个 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?一位教授告诉我这是一个硬件/架构问题,没有办法做到这一点,但我想看看可能不是这样。感谢您提供任何答案/想法/建议。
【问题讨论】:
-
您可以使用
NSDecimalNumber并实现自己的舍入行为,在执行除法时返回1和exceptionDuringOperation:error:leftOperand:rightOperand:。编辑:但是,是的,艾伦所说的可能更相关......! -
为什么要删除
if?对于pbCB,输入中有多少比例为零?如果它很低,则条件测试几乎不会花费您(分支预测会做正确的事情)。 -
@AlanStokes 检查仍然必须每次都进行。此代码在循环中遍历实时 720p 视频源的每一帧的每个像素。 pbCB 是根据 RGB 像素值计算得出的,如果 RGB = (0,0,0),它将为 0。用户很有可能将相机对准黑色物体。
-
@Matt 优化的第一条规则是衡量。 (实际上,第一条规则是“不要”,第二条规则是测量。)您需要一些标准图像来尝试您的算法,并且您需要能够准确测量您正在运行的代码需要多长时间。然后,您可以尝试进行更改以查看有效的方法,或者计算的各个部分的成本是多少。
-
@JoachimIsaksson
if在一个紧密的循环中意味着您将在分支预测出错时否定流水线的好处。这可能比sqrt甚至几个三角函数调用的成本要高得多。
标签: c++ ios arm clang divide-by-zero