導航:首頁 > 源碼編譯 > 編譯器對浮點數的處理

編譯器對浮點數的處理

發布時間:2022-03-12 15:38:13

㈠ 關於定點DSP實現浮點運算的問題(如果沒有Q格式要怎麼實現呢)求高手

誰有這方面的資料,針對ccs編譯器處理的。

㈡ 請教高手: compaq visual fortran 6.6 的編譯器中使用雙精度浮點數出現問題



EK = -1.1

改為:

EK = -1.1D0

或者
EK = -1.1_8

既可!

請注意,-1.1 是個常數,常數也有類型。如果單純的 -1.1,他還是單精度的常數。
而 -1.1D0 或 -1.1_8 才是雙精度的常數

㈢ C語言的問題

我用vc6.0編譯你的程序輸入3000沒有問題。你這程序有問題。
在有小數參與運算時,用float型變數,因為給整型變數賦值浮點數,會把小數直接舍掉。輸入3127這樣的數,肯定結果會丟掉小數那部分。
至於你說輸入3000也有問題,我想可能是tc編譯器對浮點數參與整型變數運算的處理與VC不同。

㈣ 如何在C++語言中對浮點數進行格式化處理

㈤ 如何在 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)直接調用軟浮點實現庫。

㈥ 我在用51單片機運算浮點數的乘法時出現以下情況如何解決,編譯器為KEIL2,就是乘完後的結果大於65535的...

浮點數本身就有個精度問題
C51的float浮點型只有7位有效數字,符合IEEE-754標准
浮點運算相比整數運算是很費CPU的

如果long也放不下 可以用字元大數的計算方法,不過很麻煩

㈦ C語言問題關於硬幣

這個看你用的是什麼編譯器了和你的平台有關,我用gcc在Linux下運行你的程序沒有問題
因為不同編譯器對於浮點數的處理是不同的

浮點數在計算機裡面不準確

看起來a=1.3時,a=a*100是130.000,但是在計算機裡面130.000有可能是129.99999
所以在你的程序裡面b變成25,而e變成了0(因為編譯器的處理).

這樣在後面計算時會導致誤差。下面是我的修改,增加了變數g

#include<stdio.h>
int main()
{
float a;
int b,c,d,e,sum;
int g;

sum=0;b=0;c=0;d=0;
printf("請輸入價錢 /元\n");
scanf("%f",&a);
a=a*100;
g=a+0.0001;//因為a可能不太精確,所以加上0.0001再取整,不會有很大影響

b=g/5; //改成g

e=g%5;//改成g
c=e/2;
d=e%2;
sum=b+c+d;
printf("硬幣最少數:%d\n 5分硬幣數量:%d\n 2分硬幣數量:%d\n 1分硬幣數量:%d\n",sum,b,c,d);
}

㈧ 使用浮點定製指令時,浮點常量在編譯時是做單精度還是雙精度處理

默認情況下,對於定製指令中的浮點常量在編譯時是做單精度處理的,並且浮點運算是通過硬體完成的。可以採用下面的解決方案強制編譯器把浮點常量做雙精度處理,並且通過軟體完成雙精度運算。

您可以選擇以下方案:

方案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選項。

㈨ 關於c語言中如何定義浮點數

需要准備的材料分別有:電腦、C語言編譯器。

1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp。

㈩ 浮點數問題

樓主的問題應該是浮點數在內存中的存儲,浮點數有float和double兩種。你耐心看看下面的解釋就懂了。
任何數據在內存中都是以二進制的形式存儲的,例如一個short型數據1156,其二進製表示形式為00000100 10000100。則在Intel CPU架構的系統中,存放方式為 10000100(低地址單元) 00000100(高地址單元),因為Intel CPU的架構是小端模式。但是對於浮點數在內存是如何存儲的?目前所有的C/C++編譯器都是採用IEEE所制定的標准浮點格式,即二進制科學表示法。
在二進制科學表示法中,S=M*2^N 主要由三部分構成:符號位+階碼(N)+尾數(M)。對於float型數據,其二進制有32位,其中符號位1位,階碼8位,尾數23位;對於double型數據,其二進制為64位,符號位1位,階碼11位,尾數52位。
31 30-23 22-0
float 符號位 階碼 尾數
63 62-52 51-0
double 符號位 階碼 尾數
符號位:0表示正,1表示負
階碼:這里階碼採用移碼表示,對於float型數據其規定偏置量為127,階碼有正有負,對於8位二進制,則其表示範圍為-128-127,double型規定為1023,其表示範圍為-1024-1023。比如對於float型數據,若階碼的真實值為2,則加上127後為129,其階碼表示形式為10000010
尾數:有效數字位,即部分二進制位(小數點後面的二進制位),因為規定M的整數部分恆為1,所以這個1就不進行存儲了。
下面舉例說明:
float型數據125.5轉換為標准浮點格式
125二進製表示形式為1111101,小數部分表示為二進制為 1,則125.5二進製表示為1111101.1,由於規定尾數的整數部分恆為1,則表示為1.1111011*2^6,階碼為6,加上127為133,則表示為10000101,而對於尾數將整數部分1去掉,為1111011,在其後面補0使其位數達到23位,則為11110110000000000000000
則其二進製表示形式為
0 10000101 11110110000000000000000,則在內存中存放方式為:
00000000 低地址
00000000
11111011
01000010 高地址
而反過來若要根據二進制形式求算浮點數如0 10000101 11110110000000000000000
由於符號為為0,則為正數。階碼為133-127=6,尾數為11110110000000000000000,則其真實尾數為1.1111011。所以其大小為
1.1111011*2^6,將小數點右移6位,得到1111101.1,而1111101的十進制為125,0.1的十進制為1*2^(-1)=0.5,所以其大小為125.5。
同理若將float型數據0.5轉換為二進制形式
0.5的二進制形式為0.1,由於規定正數部分必須為1,將小數點右移1位,則為1.0*2^(-1),其階碼為-1+127=126,表示為01111110,而尾數1.0去掉整數部分為0,補齊0到23位00000000000000000000000,則其二進製表示形式為
0 01111110 00000000000000000000000
由上分析可知float型數據最大表示範圍為1.11111111111111111111111*2^127=3.4*10^38
對於double型數據情況類似,只不過其階碼為11位,偏置量為1023,尾數為52位

閱讀全文

與編譯器對浮點數的處理相關的資料

熱點內容
app的數據越來越大是什麼 瀏覽:198
反編譯步驟意思 瀏覽:642
ug編程怎麼加刀補 瀏覽:623
奶片檢驗指標源碼 瀏覽:590
中國程序員top10 瀏覽:306
iphone上的app怎麼登錄 瀏覽:944
在家很無聊用什麼app 瀏覽:37
安卓介面如何更換 瀏覽:400
雲音樂程序員上線功能 瀏覽:43
小天才手錶如何查看app的使用時長 瀏覽:606
編譯器多久能寫一個 瀏覽:648
過磅怎麼演算法錢 瀏覽:873
同一款手機備份文件夾可以互用嗎 瀏覽:868
matlab圖像處理pdf 瀏覽:66
學python3最好的書 瀏覽:772
maven下載依賴的命令 瀏覽:93
二分查找流程圖演算法 瀏覽:689
質量問題的演算法 瀏覽:85
c代碼編譯吃cpu頻率還是核心 瀏覽:173
pdf簽名adobe 瀏覽:407