代码的一部分:
*det_ptr++ = (float)(dx*dy - 0.81*dxy*dxy);
其中dx,dy和dxy是浮点数。
Apple LLVM 3.0编译器为它进行以下程序集:
+0x250 vldr.32 s0, [r13, #+140]
+0x254 vldr.32 s1, [r13, #+136]
+0x258 vmul.f32 s0, s0, s1
+0x25c vcvt.f64.f32 d16, s0 <-------------- cast from float to double
+0x260 vldr.32 s0, [r13, #+132]
+0x264 vcvt.f64.f32 d17, s0 <-------------- cast from float to double
+0x268 vldr.64 d18, [r13, #+16]
+0x26c vmul.f64 d17, d18, d17
+0x270 vldr.32 s0, [r13, #+132]
+0x274 vcvt.f64.f32 d19, s0 <-------------- cast from float to double
+0x278 vmul.f64 d17, d17, d19
+0x27c vsub.f64 d16, d16, d17
+0x280 vcvt.f32.f64 s0, d16
+0x284 ldr r0, [sp, #+104]
+0x286 adds r1, r0, #4 ; 0x4
+0x288 str r1, [sp, #+104]
+0x28a vstr.32 s0, [r0]
有没有办法禁止这些演员?
答案 0 :(得分:10)
您编写程序的方式需要这些演员表。 0.81
是双精度字面值,因此在乘法发生之前必须将dxy
提升为double,并且必须在减法之前提升dx*dy
。将最终结果转换回浮点数的事实并不重要 - C标准非常清楚,无论如何都要以双精度计算这些项。
要防止促销加倍,请使用单精度文字(通过添加f
后缀):
*det_ptr++ = dx*dy - 0.81f*dxy*dxy;