【问题标题】:Apple LLVM 3.0 compiler automatic cast from float to doubleApple LLVM 3.0 编译器自动从 float 转换为 double
【发布时间】:2011-12-26 13:59:27
【问题描述】:

有一段代码:

*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]

有什么方法可以禁止这些强制转换吗?

【问题讨论】:

    标签: c assembly casting floating-point llvm


    【解决方案1】:

    您编写程序的方式需要这些演员表。 0.81 是双精度字面量,因此在乘法发生之前必须将 dxy 提升为 double,并且必须在减法之前提升 dx*dy。将最终结果转换回浮点数这一事实并不重要——C 标准非常清楚,无论如何这些术语都是以双精度计算的。

    为防止提升为双倍,请改用单精度文字(通过添加 f 后缀):

    *det_ptr++ = dx*dy - 0.81f*dxy*dxy;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      相关资源
      最近更新 更多