c - Apple LLVM 3.0 编译器自动从 float 转换为 double

标签 c assembly casting floating-point llvm

有部分代码:

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

相关文章:

程序集 8086。从标准输入中读取几个基数为 2 的数字。在屏幕上打印这些基数为 10 的数字

assembly - 在 MIPS 汇编中,如果浮点寄存器中有浮点值 X.YZDEF,如何截断到小数点后两位?

html - typescript 中 <svg> 元素的类型是什么

C 套接字 : Server gives firefox a downloadable file instead of firefox showing the page

从命令行更改显示模式

c - XOR 如何防止 shellcode 中的 NULL 字节

php - 在 PHP 中将大整数转换为完整字符串

c++ - 如何将 const uint8_t* 转换为 char*

c++ - 如何解决Windows上的编译错误C2079

c - 删除具有重复数据的项目