當前位置:首頁 » 編程軟體 » gcc編譯器float

gcc編譯器float

發布時間: 2022-05-30 08:08:04

A. gcc 函數引用參數報錯(c語言

函數參數用&i是C++的引用格式,C是不支持這個的。在VC++下面這么些無所謂,那個本身模糊了C和C++的區別。不過GCC就不一樣了,只支持C的語法,不支持C++,你這么寫當然會報錯。

warning: return makes integer from pointer without a cast應該是你函數里的問題,返還的是一個指針,但定義的時候是整數。雖然不會有錯,還是會有警告。檢查一下這是不是你的本意,是的話就要用強制轉換把指針變成整數,那樣就不會報錯。

B. 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. gcc編譯器有沒有long double型

當然有long double了。gcc中float是4位元組,double是8位元組,long double是12位元組。你自己寫一個簡單的程序sizeof(long double)就可以了,print long double的時候用Lf%格式。long double這個類型很奇怪,在很多編譯器下都有,但是往往都會出一些讓人莫不到頭腦的問題。

D. 關於C語言float單精度類型的問題

#include <stdio.h>
int main (void)
{
float g;
g = 25.585;
printf("0.3%f\n",g);

return 0;
}

運行的結果就是 25.585,這個需要你取一個小數點位數就精確了。。

------------------
不加 0.3的結果是25.584999 和加不加f沒關系..

學習C語言 最好使用linux 下的VIM來學習。。VC和turo c 等其他軟體在考試中比較常用。。對於學習來說存在許多BUG。。

編譯器當然非gcc 莫屬了,。

linux版本推薦使用 ubuntu 7以上到版本。。我家裡用的是 9.10for amd 64 ,GUI比較人性化 適合新手來操作。

VIM 可以通過 新德立 軟體來安裝。。

GCC是系統自帶的。

關於使用方法更多可以參考論壇。。個人不太喜歡復制粘貼 呵呵。。

關於你到編碼風格 希望看以下有關的書籍。。

不太建議使用非標准C編寫形式。。

建議
#include <stdio.h>
int main (int argc,char *argv[]) /*OR int main (void)*/
{
return 0;
}

另外使用gcc 的編譯文件的時候 建議開啟Wall 報錯警告。。一般警告為空才算合格。(個人例外)
gcc -Wall 1.c -o 1

---------------
以上純屬個人經驗之談 希望對你會有幫助!!~~

E. GGC編譯器顯示 warning: format 『%f』 expects argument of type 『float *』 什麼情況求大神幫忙下!

scanf("%f",&weight); 是 定 義的變數 要加地址符 ~~採納給我吧~~
scanf("%s",name); name 是 個地址所以不用&

F. 如何在 GCC 中為具有 FPU 的 Cortex M4 啟用硬體浮點數學運算

VFP (vector floating-point)
從ARMv5開始,就有可選的 Vector Floating Point (VFP)模塊,當然最新的如 Cortex-A8, Cortex-A9 和 Cortex-A5 可以配置成不帶VFP的模式供晶元廠商選擇。VFP經過若干年的發展,有VFPv2 (一些 ARM9 / ARM11)、 VFPv3-D16(只使用16個浮點寄存器,默認為32個)和VFPv3+NEON (如大多數的Cortex-A8晶元)。對於包含NEON的ARM晶元,NEON一般和VFP公用寄存器。
硬浮點Hard-float
編譯器將代碼直接編譯成發射給硬體浮點協處理器(浮點運算單元FPU)去執行。FPU通常有一套額外的寄存器來完成浮點參數傳遞和運算。使用實際的硬體浮點運算單元FPU當然會帶來性能的提升。因為往往一個浮點的函數調用需要幾個或者幾十個時鍾周期。
軟浮點 Soft-float
編譯器把浮點運算轉換成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。 現在的Linux系統默認編譯選擇使用hard-float,即使系統沒有任何浮點處理器單元,這就會產生非法指令和異常。因而一般的系統鏡像都採用軟浮點以兼容沒有VFP的處理器。
armel和armhf ABI
在armel中,關於浮點數計算的約定有三種。以gcc為例,對應的-mfloat-abi參數值有三個:soft,softfp,hard。soft是指所有浮點運算全部在層實現,效率當然不高,會存在不必要的浮點到整數、整數到浮點的轉換,只適合於早期沒有浮點計算單元的ARM處理器;softfp是目前armel的默認設置,它將浮點計算交給FPU處理,但函數參數的傳遞使用通用的整型寄存器而不是FPU寄存器;hard則使用FPU浮點寄存器將函數參數傳遞給FPU處理。需要注意的是,在兼容性上,soft與後兩者是兼容的,但softfp和hard兩種模式不兼容。默認情況下,armel使用softfp,因此將hard模式的armel單獨作為一個abi,稱之為armhf。而使用hard模式,在每次浮點相關函數調用時,平均能節省20個CPU周期。對ARM這樣每個周期都很重要的體系結構來說,這樣的提升無疑是巨大的。在完全不改變源碼和配置的情況下,在一些應用程序上,使用armhf能得到20%——25%的性能提升。對一些嚴重依賴於浮點運算的程序,更是可以達到300%的性能提升。
Soft-float和hard-float的編譯選項
在CodeSourcery gcc的編譯參數上,使用-mfloat-abi=name來指定浮點運算處理方式。-mfpu=name來指定浮點協處理的類型。可選類型如fpa,fpe2,fpe3,maverick,vfp,vfpv3,vfpv3-fp16,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd,vfpv3xd-fp16,neon,neon-fp16,vfpv4,vfpv4-d16,fpv4-sp-d16,neon-vfpv4等。使用-mfloat-abi=hard (等價於-mhard-float) -mfpu=vfp來選擇編譯成硬浮點。使用-mfloat-abi=softfp就能兼容帶VFP的硬體以及soft-float的實現,運行時的連接器ld.so會在執行浮點運算時對於運算單元的選擇,是直接的硬體調用還是庫函數調用,是執行/lib還是/lib/vfp下的libm。-mfloat-abi=soft (等價於-msoft-float)直接調用軟浮點實現庫。

G. 幫我調試找錯,我是c語言gcc編譯器 我qq 1679088991 加我

樓主你好。
#define YEARS 5//因為是5年的數據所以這里應該是5
#define MONTHS 12//應該是12個月
#include <stdio.h>
int main (void)
{
float rain[YEARS][MONTHS]={
{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
{9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
{7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
{7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2},
};
int index,index2;
float total=0;
float total_year[YEARS]={0},total_month[MONTHS]={0};//這里用YEARS和MONTHS做數組大小
for(index=0; index<YEARS ;index++){//注意這兩個循環都應該是<而不是<=
for(index2=0;index2<MONTHS ;index2++){
total_year[index]+=rain[index][index2];
}
total+=total_year[index];
printf("%d year %.4f rain\n",index+1,total_year[index]);
}
printf ("years average %.4f\n",total/5);
total_month[0]=0;
for(index2=0;index2<MONTHS ;index2++){//這里也是<而不是<=
for(index=0;index<YEARS ;index++){
total_month[index2]+=rain[index][index2];
}
printf("%d month average %.4f rain \n",index2+1,total_month[index2]/YEARS);//YEARS做分母
}
/*計算出年降水總量,年降水平均量,。*/
return 0;
}

總之,樓主代碼中暴露出個問題就是,比如你要聲明一個有12的元素的數組,那麼應該這么聲明:
int matrix[12];//而不是11
然後數組元素分別是matrix[0]到matrix[11],感覺你這里有些搞混了。
希望對你有幫助。
Q就不加了吧,有問題可以Hi我。

H. C語言中 int->float : float(a) (合法)和 (float) a的區別g++都支持,gcc只支持第二個

第一種是C++的用法,所以g++支持,
第二個是C裡面的強制類型轉換,C/C++都支持

I. 軟浮點與硬浮點有什麼區別

軟浮點是通過浮點庫去實現浮點運算的,效率低;硬浮點是通過浮點運算單元(FPU)來完成的,效率高。
(1)硬浮點(hard-float)
編譯器將代碼直接編譯成硬體浮點協處理器(浮點運算單元FPU)能識別的指令,這些指令在執行的時候ARM核直接把它轉給協處理器執行。FPU 通常有一套額外的寄存器來完成浮點參數傳遞和運算。使用實際的硬體浮點運算單元(FPU)會帶來性能的提升。
(2)軟浮點(soft-float)
編譯器把浮點運算轉成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。現在的Linux系統默認編譯選擇使用hard-float,如果系統沒有任何浮點處理器單元,這就會產生非法指令和異常。因而一般的系統鏡像都採用軟浮點以兼容沒有VFP的處理器。

J. linux用gcc編譯

運行結果我不給了,自己看:
直接編譯:
gcc main.c compute.c input.c -o power
運行程序
./power
makefile 最簡單,直觀的的編寫方法:
power:main.o compute.o input.o
cc main.o compute.o input.o -o power
main.o:main.c main.h compute.h input.h
cc -c main.c

compute.o:compute.c compute.h
cc -c compute.c
input.o:input.c input.h
cc -c input.c
.PHONY : clean
clean :
rm -f *.o power

保存後成makefile或Makefile推薦使用後者:
make
想重新編譯前運行:
make clean
make
運行程序:
./power
特別說明:cc,rm命令行前有一個tab符,別搞錯了。cc 在linux上是指向gcc的軟符號鏈接,為了兼容其他系統,我們寫的cc。
makefile有更簡寫但不簡單的寫法,不給出來。你提問這個說明你不會編寫makefile,給出的是最基本用法。有興趣自己看,一天能學完。

熱點內容
孕期計演算法 發布:2024-05-21 12:29:58 瀏覽:417
android虛擬事件 發布:2024-05-21 12:29:11 瀏覽:114
javaeffective 發布:2024-05-21 11:39:58 瀏覽:765
演算法高效 發布:2024-05-21 11:16:06 瀏覽:139
十年前電腦做伺服器 發布:2024-05-21 11:14:35 瀏覽:971
解壓之音 發布:2024-05-21 11:07:37 瀏覽:866
安卓如何玩手機游戲 發布:2024-05-21 10:03:15 瀏覽:109
好的少兒編程學校 發布:2024-05-21 10:02:38 瀏覽:439
c語言字元個數統計 發布:2024-05-21 09:54:31 瀏覽:415
ubuntupython文件 發布:2024-05-21 09:41:01 瀏覽:162