更改C++/iOS中默认的除以0的行为
Change default divide by 0 behavior in C++/iOS
我正在构建一个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 ' 00'
我想知道的是,是否有一种方法可以更改除以0的定义,使其返回1?一位教授告诉我,这是一个硬件/架构问题,没有办法解决,但我想看看情况是否并非如此。谢谢你的回答/想法/建议。
就像Alan Stokes提到的那样,您无法有效地更改如何处理除以零。
但是,根据您使用的值的语义和范围,可能会提升和/或缩放您的输入,这样就不会留下0了。
编辑:我所说的语义是指所讨论的相机实际产生的值的范围。许多数码相机实际上无法产生完整的RGB范围。如果没有,您可以使用这些信息将您的输入转换到所需的范围。
如果你没有这类信息,或者你的相机确实产生了(0,0,0)-(255255255),另一种选择是将你的输入提升为浮动,并根据需要以该格式移动和/或缩放。这将需要更多的计算,但它可能比失败的分支预测成本更低。在做出任何最终决定之前,一定要测量对代表性输入样本的影响。
不,你不能。它由浮点规范指定,并在硬件中实现。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 初始化具有非默认构造函数的std::数组项的更好方法
- 何时提供默认参数作为模板参数
- 是默认情况下分配给char数组常量的值
- 具有默认值的引用获取函数
- 具有默认模板类型的默认构造函数的类型推导
- 当给定默认值时,为什么此模板参数推导失败
- 修改 VS Code 中的默认C++代码段
- 声明默认的模板化函数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何使用非默认构造函数实例化模板化类
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 格式化浮点值:返回默认值
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr