① 使用浮点定制指令时,浮点常量在编译时是做单精度还是双精度处理
默认情况下,对于定制指令中的浮点常量在编译时是做单精度处理的,并且浮点运算是通过硬件完成的。可以采用下面的解决方案强制编译器把浮点常量做双精度处理,并且通过软件完成双精度运算。
您可以选择以下方案:
方案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位小数。