c語言中單精度
⑴ c語言數據類型中「雙精度」「單精度」是什麼意思
1、單精度和雙精度都指浮點數,就是帶小數點的數
2、單精度數的有效位數比較少,7位左右,雙精度的在幾十位。
3、單精度定義是用float
4、雙精度定義是用double
比如:
#include
main(){
float
pi_f
=
m_pi;
double
pi_d
=
m_pi;
printf("%e,",pi_f);
printf("%e",pi_d);
}
⑵ 什麼是c語言裡面的單精度
單精度、雙精度、長雙精度是以他們的有效數字加以區分的。
單精度的有效數字是7位,用float定義。就是說它在7位有效數字之外的位做加減等運算的結果很可能結果不準確。如float的a=100000000,a+20的結果不是100000020,他只保證100000000是准確的
雙精度的話可以保證16位有效數字是准確,長雙精度的是19位
這樣可以嗎?
⑶ C語言的單精度與雙精度如何區別
其實就是有效位數不一樣。
浮點型變數分為單精度(float)、雙精度(double)和長雙精度(longdouble)3類。在TurboC中:
比特(位)數有效數字
float326-7
double6415-16
longdouble12818-19
ANSIC並未具體規定每種類型數據的長度、精度、數值范圍,有的系統將double所增加的32位全用於存放小數部分,這樣可以增加數值的有效范圍,減少舍入誤差。有的系統則將所增加的位(bit)一部分存放指數部分,這樣可以擴大數值范圍
⑷ 什麼是c語言裡面的單精度
其實就是有效位數不一樣。
浮點型變數分為單精度(float)、雙精度(double)和長雙精度(long
double)3類。在Turbo
C
中:
比特(位)數
有效數字
float
32
6-7
double
64
15-16
long
double
128
18-19
ANSI
C
並未具體規定每種類型數據的長度、精度、數值范圍,有的系統將double所增加的32位全用於存放小數部分,這樣可以增加數值的有效范圍,減少舍入誤差。有的系統則將所增加的位(bit)一部分存放指數部分,這樣可以擴大數值范圍
⑸ c語言里單精度和雙精度怎麼理解
單精度和雙精度顧名思義是兩種精度的不同劃分,單精度float是保證7位有效數字,double是保證16位有效數字。
例:(float)(10%3)
結果是1.000000即七位有效數字,(後面不一定全是0,計算機可隨機選擇數字,所以整數1不等於float或double的1)
(double)(10%3)
同理結果是:1.XXXXXXXXXX……後面有十五位的有效數字
雖然整數位都是1,但由於有效位數不同,即後面隨機派出的小數可能不同,所以二者理論上不同,實際比較不能用==,要用fabs()<1e-6.
⑹ c語言中單精度和雙精度是什麼
單精度和雙精度是這對浮點運算來說的,也就是通常說的小數,單精度浮點最少有小數點後6位,雙精度至少是小數點後10位,應為編譯器或者平台不同說以小數點後面多少位是不同的,當是C語音已經規定了小數點後幾位最小的值,最大有多少要看具體的系統來定
⑺ 在C語言裡面,單精度和雙精度有什麼區別和聯系
單精度和雙精度數值類型最早出現在C語言中(比較通用的語言裡面),在C語言中單精度類型稱為浮點類型(Float),顧名思義是通過浮動小數點來實現數據的存儲。這兩個數據類型最早是為了科學計算而產生的,他能夠給科學計算提供足夠高的精度來存儲對於精度要求比較高的數值。但是與此同時,他也完全符合科學計算中對於數值的觀念:
當我們比較兩個棍子的長度的時候,一種方法是並排放著比較一下,一種方法是分別量出長度。但是事實上世界上並不存在兩根完全一樣長的棍子,我們測量的長度精度受到人類目測能力和測量工具精度的限制。從這個意義上來說,判斷兩根棍子是否一樣長絲毫沒有意義,因為結果一定是False,但是我們可以比較他們兩個哪個更長或者更短。這個例子很好地概括了單精度/雙精度數值類型的設計初衷和存在意義。
基於上述認識,單精度/雙精度數值類型從一開始設計的時候,就不是一個准確的數值類型,他只保證在他這個數值類型的精度之內是准確的,精度之外則不保證,比方說,一個數值5.1,很可能存儲在單精度/雙精度數值中的實際值是5.100000000001或者5.09999999999999。導致這個現象的原因我們可以通過兩種方式來解釋:
簡單的解釋方法:
你可以嘗試在任何一個控制項的屬性面板中,設定他的寬度為:3.2CM,當你輸入完畢後,你會發現值自動變成了3.199cm,無論你怎麼改,你都無法輸入3.200CM,因為實際上在電腦中存儲的並不是CM為單位的數值,而是「緹」為單位的數值,而「緹」和CM之間的比值,是個很難被除盡的數,因此你輸入完畢後,電腦自動轉換成了最接近的「緹」值,然後再轉換成厘米顯示到屬性面板上,這一乘一除,兩次四捨五入,誤差就出來了。單精度/雙精度也是類似的原理,其實在二進制存儲的時候,單精度/雙精度都採用了類似相近分數的方法,而這樣的存儲是不可能做到准確的。
深入的解釋方法:
讓我們來看看我們存儲到數字介質中的單精度/雙精度值到底是怎麼樣的,我們使用如下代碼對單精度類型進行一個解剖:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Sub floatTest()
Dim dblVar As Single
dblVar = 5.731 / 8
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
End Sub
Public Sub dblOutput(ByVal dblVar As Single)
Dim bytVar(3) As Byte
Dim i As Integer, j As Integer
Dim strVar As String
CopyMemory ByVal VarPtr(bytVar(0)), ByVal VarPtr(dblVar), 4
strVar = dblVar & ": "
For i = 3 To 0 Step -1
For j = 7 To 0 Step -1
strVar = strVar & (bytVar(i) And 2 ^ j) / 2 ^ j
Next j
strVar = strVar & " "
Next i
Debug.Print strVar
End Sub
運行後我們得到輸出結果(輸出格式為高位左,低位右):
.716375: 00111111 00110111 01100100 01011010
1.43275: 00111111 10110111 01100100 01011010
2.8655: 01000000 00110111 01100100 01011010
5.731: 01000000 10110111 01100100 01011010
11.462: 01000001 00110111 01100100 01011010
22.924: 01000001 10110111 01100100 01011010
這里,我們把單精度類型轉化成了二進制數據輸出,這里我們看到,雖然這六個數字完全不同,但是他們的二進制存儲驚人地相似,我們看到紅色標記部分,每次都是加1,事實上,單精度數據類型使用從高位開始第1位作為正負標記位(綠色),第2位到第9位,是一個跨位元組的有符號位元組類型數據,這個數值決定了小數點移動的方向和位數(紅色),第10位到32位保存一個整數(藍色)在存儲過程中,電腦首先把輸入的值不斷移位(乘除2)直到這個數的整數部分佔用了全部24位的整數位,然後把移動的位數寫入浮點部分(紅色),而移位後的結果寫入整數部分(藍色和綠色),小數部分則舍棄。求值的時候則是反向過程,先根據正負位和整數位求值,然後根據紅色部分的整數來進行移位(乘除2的次方),最終才是我們得到的單精度數值。雙精度數值也是同樣原理,只是位數更多而已。
通過解剖單精度數值的二進制存儲格式,我們可以清楚看到,實際上單精度/雙精度的存儲,都要通過乘法和除法,其中必有舍入,如果恰好你的數值在除法中被舍入了,那麼你賦的初值就很可能與你最終存儲的值不完全相同,其中的微小差異,並不與單精度/雙精度的設計目標相違背。
當我們在資料庫中或者VBA代碼中使用一個單精度/雙精度數值的時候,也許你從界面上看不到區別,但是在實際的存儲中,這個差別卻真真切切地就在那裡,當你對其進行相等比較的時候,系統只是簡單地作二進制的比較,界面上無法體現的微小差異,在二進制比較面前卻無處遁形,於是,你的等於比較返回了一個意料之外的False。
⑻ C語言中單精度,雙精度,長雙精度分別是什麼意思
國際標准浮點格式,位元組越長精度越高:
單精度浮點(float):4個位元組長
雙精度浮點(dloube):8個位元組長,
長雙精度(long
double):10個位元組長。
根據你C/C++程序的需要,可以定義浮點變數,
精度高,占的位元組也多。
⑼ C語言中的 單精度型 和雙精度型是什麼意思
單精度和雙精度最大區別就是結果精確到第幾位。
單精度是這樣的格式,1位符號,8位指數,23位小數。
⑽ c語言中的單精度數據的有效位數是什麼意思
c語言中的單精度數據的有效位數是7位。
c語言中的單精度浮點數的實際有效精度為24位二進制,這相當於 24*log102≈7.2 位10進制的精度。尾數用23位存儲,加上默認的小數點前的1位1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。
(10)c語言中單精度擴展閱讀:
單精度浮點數是用來表示帶有小數部分的實數,一般用於科學計算。在計算機存儲器中佔用4個位元(32 bits)存儲空間,包括符號位1位,階碼8位,尾數23位。利用「浮點」(浮動小數點)的方法,可以表示一個范圍很大的數值。其數值范圍為-3.4E38~3.4E38。
單精度浮點數最多有7位十進制有效數字,如果某個數的有效數字位數超過7位,當把它定義為單精度變數時,超出的部分會自動四捨五入。單精度浮點數的指數用「E」或「e」表示。