Objective-C中的非规范化浮点
Denormalized floating point in Objective-C?
Stack的相关性是什么;溢出问题/答案为什么将0.1f更改为0会使性能降低10倍对于Objective-C?如果有任何相关性,这应该如何改变我的编码习惯?有没有办法关闭Mac上的非规范化浮点;OS;十、
这似乎与iOS完全无关。这是正确的吗?
正如我在回应您的评论时所说:
与其说是语言问题,不如说是CPU问题,所以它可能与x86上Objective-C的相关性。(iPhone的ARMv7似乎不支持非规范化浮点,至少使用默认运行时/构建设置)
更新
我刚测试过。在x86上的Mac OS X上可以观察到速度减慢,而在ARMv7上的iOS上则不然(默认构建设置)。
不出所料,在iOS模拟器(x86上)上运行的非规范化浮点再次出现。
有趣的是,FLT_MIN
和DBL_MIN
分别被定义为最小的非规范化数(在iOS、Mac OS X和Linux上)。使用会发生奇怪的事情
DBL_MIN/2.0
在您的代码中;编译器很乐意设置一个非规范化常数,但(arm)CPU一接触它,它就被设置为零:
double test = DBL_MIN/2.0;
printf("test == 0.0 %dn",test==0.0);
printf("DBL_MIN/2 == 0.0 %dn",DBL_MIN/2.0==0.0);
输出:
test == 0.0 1 // computer says YES
DBL_MIN/2 == 0.0 0 // compiler says NO
因此,运行时快速检查是否支持反规范化可以是:
#define SUPPORT_DENORMALIZATION ({volatile double t=DBL_MIN/2.0;t!=0.0;})
("在没有任何用途的适用性暗示保证的情况下提供")
这是ARM在"清零"模式下要说的话:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204h/Bcfheche.html
更新<lt;1
这就是在ARMv7:上禁用刷新为零模式的方法
int x;
asm(
"vmrs %[result],FPSCR rn"
"bic %[result],%[result],#16777216 rn"
"vmsr FPSCR,%[result]"
:[result] "=r" (x) : :
);
printf("ARM FPSCR: %08xn",x);
结果令人吃惊。
- 第1列:浮点值,每次迭代除以2
- 第2列:此浮点的二进制表示
- 第3列:将此浮点值相加1e7次所花费的时间
你可以清楚地看到,非规范化是零成本的。(对于iPad2。在iPhone 4上,它只需要降低10%的速度。)
0.000000000000000000000000000000000100000004670110: 10111100001101110010000011100000 110 ms
0.000000000000000000000000000000000050000002335055: 10111100001101110010000101100000 110 ms
0.000000000000000000000000000000000025000001167528: 10111100001101110010000001100000 110 ms
0.000000000000000000000000000000000012500000583764: 10111100001101110010000110100000 110 ms
0.000000000000000000000000000000000006250000291882: 10111100001101110010000010100000 111 ms
0.000000000000000000000000000000000003125000145941: 10111100001101110010000100100000 110 ms
0.000000000000000000000000000000000001562500072970: 10111100001101110010000000100000 110 ms
0.000000000000000000000000000000000000781250036485: 10111100001101110010000111000000 110 ms
0.000000000000000000000000000000000000390625018243: 10111100001101110010000011000000 110 ms
0.000000000000000000000000000000000000195312509121: 10111100001101110010000101000000 110 ms
0.000000000000000000000000000000000000097656254561: 10111100001101110010000001000000 110 ms
0.000000000000000000000000000000000000048828127280: 10111100001101110010000110000000 110 ms
0.000000000000000000000000000000000000024414063640: 10111100001101110010000010000000 110 ms
0.000000000000000000000000000000000000012207031820: 10111100001101110010000100000000 111 ms
0.000000000000000000000000000000000000006103515209: 01111000011011100100001000000000 110 ms
0.000000000000000000000000000000000000003051757605: 11110000110111001000010000000000 110 ms
0.000000000000000000000000000000000000001525879503: 00010001101110010000100000000000 110 ms
0.000000000000000000000000000000000000000762939751: 00100011011100100001000000000000 110 ms
0.000000000000000000000000000000000000000381469876: 01000110111001000010000000000000 112 ms
0.000000000000000000000000000000000000000190734938: 10001101110010000100000000000000 110 ms
0.000000000000000000000000000000000000000095366768: 00011011100100001000000000000000 110 ms
0.000000000000000000000000000000000000000047683384: 00110111001000010000000000000000 110 ms
0.000000000000000000000000000000000000000023841692: 01101110010000100000000000000000 111 ms
0.000000000000000000000000000000000000000011920846: 11011100100001000000000000000000 110 ms
0.000000000000000000000000000000000000000005961124: 01111001000010000000000000000000 110 ms
0.000000000000000000000000000000000000000002980562: 11110010000100000000000000000000 110 ms
0.000000000000000000000000000000000000000001490982: 00010100001000000000000000000000 110 ms
0.000000000000000000000000000000000000000000745491: 00101000010000000000000000000000 110 ms
0.000000000000000000000000000000000000000000372745: 01010000100000000000000000000000 110 ms
0.000000000000000000000000000000000000000000186373: 10100001000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000092486: 01000010000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000046243: 10000100000000000000000000000000 111 ms
0.000000000000000000000000000000000000000000022421: 00001000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000011210: 00010000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000005605: 00100000000000000000000000000000 111 ms
0.000000000000000000000000000000000000000000002803: 01000000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000001401: 10000000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 110 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 110 ms
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 将公共但非静态的成员函数与ALGLIB集成
- 提升精神:解析布尔表达式并简化为规范范式
- 不同翻译单元中不可重载的非内联函数定义
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 初始化具有非默认构造函数的std::数组项的更好方法
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- C++,术语,非规范,阻塞,检测消息结束
- 是C 标准非规范的核心语言规范中的注释和示例
- 局部变量作为非类型参数,具有模板规范
- 在C++中创建非规范化(亚正规)浮点值
- Objective-C中的非规范化浮点
- 是否存在允许将非const模板实参类型隐式转换为const的规范方法?
- 检查c++中的零或非规范化数字
- 如何在单位边界框中规范化3D非彩色网格
- 使用 C++,有没有办法检测浮点/双精度非正态化是否被编译器/系统"规范化"?
- c++规范是否允许非虚类的实例包含虚值表指针的内存?