導航:首頁 > 源碼編譯 > 代碼編譯過程浮點

代碼編譯過程浮點

發布時間: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位小數。

閱讀全文

與代碼編譯過程浮點相關的資料

熱點內容
imac混合硬碟命令 瀏覽:275
沈陽用什麼app租房車 瀏覽:855
00後高中生都用什麼app 瀏覽:235
戴爾塔式伺服器怎麼打開獨立顯卡 瀏覽:807
醫療程序員招聘 瀏覽:597
住宿app可砍價是什麼意思 瀏覽:133
java跳出語句 瀏覽:55
javastring個數 瀏覽:928
人工免疫演算法應用 瀏覽:79
有什麼app能收聽俄羅斯廣播電台 瀏覽:34
2015考研紅寶書pdf 瀏覽:443
程序員幾月跳槽合適 瀏覽:444
液壓油可壓縮嗎 瀏覽:946
源泉cad加密文件 瀏覽:127
銀河v10驅動重編譯 瀏覽:891
電腦上文件夾右擊就會崩潰 瀏覽:691
右美維持演算法 瀏覽:940
php基礎編程教程pdf 瀏覽:220
穿越之命令與征服將軍 瀏覽:352
android廣播重復 瀏覽:833