有部分代码:
*det_ptr++ = (float)(dx*dy - 0.81*dxy*dxy);
其中 dx、dy 和 dxy 是 float 。
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.81
是 double 文字,因此 dxy
必须在乘法发生之前提升为 double,并且 dx*dy
必须在乘法之前提升减法。您将最终结果重新转换为 float 这一事实并不重要——C 标准非常清楚,无论如何这些项都是以 double 计算的。
为防止提升为 double ,请改用单精度文字(通过添加 f
后缀):
*det_ptr++ = dx*dy - 0.81f*dxy*dxy;
关于c - Apple LLVM 3.0 编译器自动从 float 转换为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8636413/