导航:首页 > 源码编译 > 代码编译过程浮点

代码编译过程浮点

发布时间:2023-05-17 14:35:40

① 使用浮点定制指令时,浮点常量在编译时是做单精度还是双精度处理

默认情况下,对于定制指令中的浮点常量在编译时是做单精度处理的,并且浮点运算是通过硬件完成的。可以采用下面的解决方案强制编译器把浮点常量做双精度处理,并且通过软件完成双精度运算。

您可以选择以下方案:

方案1- 修改软件代码,向浮点常量添加后缀“L”,确保这些变量不会被做单精度处理

下表给出了代码,浮点定制指令,精度和实现模式之间的关系

Example Code FP CI Usage Precision Implementation

b= a * 4.67 Yes Single Hardware

b = a * 4.67 No Double Software

b = a * 4.67f Yes Single Hardware

b = a * 4.67f No Single Software

b = a * 4.67L don't care* Double Software

*浮点定制指令的硬件不会用于双精度运算



方案2-手动修改public.mk文件,删除-mcustom-fpu-config选项,用独立的编译选项代替,但不要使用-fsingle-precision-constant选项。


"-mcustom-fpu-config=60-1" 修改为 "-mcustom-fmuls=252 –mcustom-fadds=253 –mcustom-fsubs=254" 或者


"-mcustom-fpu-config=60-2" 修改为 "-mcustom-fmuls=252 –mcustom-fadds=253 –mcustom-fsubs=254 –mcustom-divs=255"


请注意60-1和60-2之间是有区别的,60-1没有-mcustom-divs选项。

② 64位gcc编译浮点加法为什么每次mov指令都执行两次

这个,你需要先查一下x86_64传递参数的规则。浮点数是用 xmm0, xmm1,xmm2,xmm3来传递参数的。


你还需要了解一下SIMD指令集。


http://en.wikipedia.org/wiki/X86_calling_conventions


我不知道为什么你反汇编出来是这样。我自己测试了一下,反汇编结果比你的简单多了。


你的编译器,可能规则和我的稍有不同。比我的复杂一些。


大概翻译如下:

0x00000000004014f0<+0>:push%rbp
0x00000000004014f1<+1>:sub$0x4,%rsp
0x00000000004014f5<+5>:lea0x80(%rsp),%rbp
0x00000000004014fd<+13>:movss%xmm0,-0x6c(%rbp)====>参数s保存在xmm0中,把它压到栈上位置为-0x6c(%rbp)
0x0000000000401502<+18>:movss-0x6c(%rbp),%xmm0====>xmm0可以保存4个float,这样,仅仅把-0x6c(%rbp)位置的一个floats传递到xmm0寄存器,准备做float的运算
0x0000000000401507<+23>:addss%xmm0,%xmm0====>2个float相加,相加结果保存在xmm0中
0x000000000040150b<+27>:movss%xmm0,-0x80(%rbp)==>把相加的结果,保存在栈上位置为-0x80(%rbp),但是这里是4个float,其中高位三个都是0.0,最低位一个是s+s的结果
0x0000000000401510<+32>:mov-0x80(%rbp),%eax==>eax是保存结果的规定寄存器,保存一份结果,这下只会保存最低位的float,也就是我们需要的结果
0x0000000000401513<+35>:mov%eax,-0x80(%rbp)==>传回去,有点绕,本质上是编译器的不同,一些编译器有一些特定的规则,主要的目的是为了下面传递给xmm0,只能从栈上穿,movss指令只能这样用。
0x0000000000401516<+38>:movss-0x80(%rbp),%xmm0==>返回结果需要保存在xmm0中,所以又传给它了。为什么要穿来传去呢,因为xmm0可以保存4个float,可以同时进行4个float运算,上面的步骤是为了保证,只有最后一个float运算的结果被保存,前面三个float,结果都是0.0,但是不管是什么,结果都被忽略了。
0x000000000040151b<+43>:add$0x4,%rsp==>清除栈,返回
0x000000000040151f<+47>:pop%rbp
0x0000000000401520<+48>:retq

③ C语言中说的浮点型是什么意思呢

C语言中说的浮点型就是带小数点的数,也就是小数。(只是在计算机领域中“浮点型”是小数的专业替代名词)

(3)代码编译过程浮点扩展阅读:

在计算机系统的发展过程中,曾经提出过多种方法表示实数,但是到目前为止使用最广泛的是浮点表示法。相对于定点数而言,浮点数(浮点型)利用指数使小数点的位置可以根据需要而上下浮动,从而可以灵活地表达更大范围的实数。

④ 关于c语言中如何定义浮点数

需要准备的材料分别有:电脑、C语言编译器。

1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。

⑤ delphi 编译出来的一个小程序 运行出现浮点值超出计算机表示范围 本人有源码求大神解答

超过8字节, 你的小数点后面数字太长宏隐告中了~~
用Format函数, 格式化一下就蔽友厅行了。比如
d:= 4.41587329128523;
d:= Format('%.2f', [d]);
输出d应该为4.42 保留2位小数。

阅读全文

与代码编译过程浮点相关的资料

热点内容
液压油可压缩吗 浏览:944
源泉cad加密文件 浏览:125
银河v10驱动重编译 浏览:889
电脑上文件夹右击就会崩溃 浏览:689
右美维持算法 浏览:938
php基础编程教程pdf 浏览:219
穿越之命令与征服将军 浏览:351
android广播重复 浏览:832
像阿里云一样的服务器 浏览:318
水冷空调有压缩机吗 浏览:478
访问日本服务器可以做什么 浏览:434
bytejava详解 浏览:450
androidjava7 浏览:385
服务器在山洞里为什么还有油 浏览:887
天天基金app在哪里下载 浏览:975
服务器软路由怎么做 浏览:293
冰箱压缩机出口 浏览:229
OPT最佳页面置换算法 浏览:645
网盘忘记解压码怎么办 浏览:853
文件加密看不到里面的内容 浏览:654