A. c語言里單精度和雙精度怎麼理解
單精度和雙精度顧名思義是兩種精度的不同劃分,單精度float是保證7位有效數字,double是保證16位有效數字。
例:(float)(10%3)
結果是1.000000即七位有效數字,(後面不一定全是0,計算機可隨機選擇數字,所以整數1不等於float或double的1)
(double)(10%3)
同理結果是:1.XXXXXXXXXX……後面有十五位的有效數字
雖然整數位都是1,但由於有效位數不同,即後面隨機派出的小數可能不同,所以二者理論上不同,實際比較不能用==,要用fabs()<1e-6.
B. 在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. C語言中的 單精度型 和雙精度型是什麼意思
1、單精度和雙精度都指浮點數,就是帶小數點的數
2、單精度數的有效位數比較少,7位左右,雙精度的在幾十位。
3、單精度定義是用float
4、雙精度定義是用double
比如:
#include <math.h>
main(){
float pi_f = M_PI;
double pi_d = M_PI;
printf("%E,",pi_f);
printf("%E",pi_d);
}
D. c語言中單精度和雙精度是什麼
單精度和雙精度是這對浮點運算來說的,也就是通常說的小數,單精度浮點最少有小數點後6位,雙精度至少是小數點後10位,應為編譯器或者平台不同說以小數點後面多少位是不同的,當是C語音已經規定了小數點後幾位最小的值,最大有多少要看具體的系統來定
E. C語言中的單精度和雙精度浮點型的區別!3.14是哪種3.14159呢
3.14是單精度,3.14159是雙精度。
兩者區別如下:
一、指代不同
1、單精度:是指計算機表達實數近似值的一種方式。
2、雙精度:此數據類型與單精度數據類型(float)相似,但精確度比float高。
二、佔用空間不同
1、單精度:范圍在負數的時候是從 -3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45 到 3.402823E38 。
2、雙精度:雙精度型佔8 個位元組(64位)內存空間,其數值范圍為-1.79769313486232E308 到1.79769313486232E308。
三、特點不同
1、單精度:數值比以上值小的時候,將會由於尾數的有效位數減少而逐步喪失精度(IEEE 754的規定),或者有的系統則直接採用0值來簡化處理過程。
2、雙精度:編譯時所佔的內存空間依不同的編譯器而有所不同,是double float數據類型,C/C++中表示實型變數的一種變數類型。
F. 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);
}
G. C語言中單精度浮點數和雙精度分別如何表示有什麼差別
C語言中,單精度浮點型為float, 雙精度浮點型為double。
Float為單精度,內存中佔4個位元組,有效數位是7位(因為有正負,所以不是8位),在我的電腦且VC++6.0平台中默認顯示是6位有效數字。
double為雙精度,佔8個位元組,有效數位是16位,但在我的電腦且VC++6.0平台中默認顯示同樣是6位有效數字。
二者區別:
佔用位元組空間不同。
一個float變數佔用四位元組,一個double類型變數,一般佔用8位元組。表示範圍不同。
float表示範圍為-3.4E-38~3.4E+38。double 表示範圍為-1.7E-308~1.7E+308。
精度不同。
float在表示十進制時,有效數字為6到7位。double在表示十進制時,有效數字為15到16位。輸入輸出格式不同。
在C語言中,輸入輸出格式化字元串,float使用%f,而double使用%lf。
H. c語言中什麼是單精度型和雙精度型各舉個例子。。。
單精度型和雙精度型的區別在於它們的精確程度不一樣,也就是小數部分的有效位數不一樣。
單精度數(float型)在32位計算機中存儲佔用4位元組,也就是32位,有效位數為7位,小數點後6位;雙精度數(double型)在32位計算機中存儲佔用8位元組,也就是64位,有效位數為16位,小數點後15位。
比如3.1415926535897932384這個小數,如果定義成float型,那麼只會留下小數點後5位,也就是3.141592,如果定義成double型,那麼只會留下小數點後15位,也就是3.141592653589793。
(8)c語言單精度浮點和雙精度擴展閱讀
計算機的數都是以二進制進行存儲。無論是單精度浮點數還是雙精度浮點數,在計算機上的存儲都遵循IEEE 754規范,使用二進制科學計數法。
二進制科學計數法包含三個部分:符號位,指數位和尾數部分。單精度數的符號位,指數位和尾數部分分別為1,8,23,而雙精度為1,11,52。
而單雙精度中的精度就主要取決於尾數部分的位數。float的尾數尾數為23位,除去全部為0的情況以外,最小為2的-23次方,因此float小數部分只能精確到後面6位。類似的,double尾數位數為52,最小為2的-52次方,因此只能精確到小數點後15位。
I. C語言的單精度與雙精度如何區別
其實就是有效位數不一樣。
浮點型變數分為單精度(float)、雙精度(double)和長雙精度(longdouble)3類。在TurboC中:
比特(位)數有效數字
float326-7
double6415-16
longdouble12818-19
ANSIC並未具體規定每種類型數據的長度、精度、數值范圍,有的系統將double所增加的32位全用於存放小數部分,這樣可以增加數值的有效范圍,減少舍入誤差。有的系統則將所增加的位(bit)一部分存放指數部分,這樣可以擴大數值范圍
J. c語言中,常量,變數,浮點,單精度,雙精度是什麼意思舉例
實型常量又稱實數或浮點數。在C語言中可以用單精度型和雙精度型兩種形式表示實型常量,分別用類型名float和double進行定義。
實型常量在一般的微型集中佔用4個位元組,一般形式或者指數形式,數值范圍都是-1038~1038,有效數字是7位。
浮點型數據又分為單精度型(float)和雙精度型(double)兩種。
1、單(float):佔用比特數32,有效數位6-7,數值范圍(-3.4e-38~3.4e+38)
2、雙(double):佔用比特數64,有效數位15-16,數值范圍(-1.7e-308~1.7e+308)
(10)c語言單精度浮點和雙精度擴展閱讀
c語言中,數據類型分為整形、實型和指針類型(以下內容均表示在32位操作系統中):
其中整形分為char,shortint,longint,longlong,各種類型的使用,前面都可以加上unsigned表示無符號char字元類型,表示的大小為-128~127,大小為一個位元組;
其中0-127被編為ASCⅡ碼shortint短整形-65536~655352個位元組longint整形-20億多~20億多4個位元組longlong長整型8個位元組longint通常寫為int代表的是CPU字長;
在32為操作系統中cpu的字長是32位,即4個位元組實行(浮點型)分為float和double:float6~7位有效數字4個位元組double15~16位有效數字8個位元組在現代CPU中,有一個協處理器專門進行浮點數的運算;
然後根據類型進行精度截取指針類型32位無符號整數,即unsignedint,但是它只能表示內存中一個比特的空間的編號註:32位CPU的內存定址范圍是從32個0到32個1,總計4GB,所以,32位操作系統最高只支持4G內存。