4.2用C語言表示:double d = 4.2。C語言中用于描述小數(shù)的數(shù)據(jù)類型是float和double,float類型表示單精度浮點數(shù),double表示雙精度浮點數(shù)。
1、float:
FLOAT 數(shù)據(jù)類型用于存儲單精度浮點數(shù)或雙精度浮點數(shù)。浮點類型的單精度值具有 4 個字節(jié),包括一個符號位、一個 8 位 excess-127 二進制指數(shù)和一個 23 位尾數(shù)。
2、double:
double(雙精度浮點數(shù))使用 64 位(8字節(jié)) 來儲存一個浮點數(shù)。 它可以表示十進制的15或16位有效數(shù)字。
擴展資料
(1) 浮點型與整型
將浮點數(shù)(單雙精度)轉(zhuǎn)換為整數(shù)時,將舍棄浮點數(shù)的小數(shù)部分, 只保留整數(shù)部分。將整型值賦給浮點型變量,數(shù)值不變,只將形式改為浮點形式, 即小數(shù)點后帶若干個0。注意:賦值時的類型轉(zhuǎn)換實際上是強制的。
(2) 單、雙精度浮點型
由于C語言中的浮點值總是用雙精度表示的,所以float 型數(shù)據(jù)只是在尾部加0延長為double型數(shù)據(jù)參加運算,然后直接賦值。double型數(shù)據(jù)轉(zhuǎn)換為float型時,通過截尾數(shù)來實現(xiàn),截斷前要進行四舍五入操作。
參考資料:百度百科-C語言類型強制轉(zhuǎn)換
中國自古以來就使用十進位制計數(shù)法,一些實用的計量單位也采用十進制,所以很容易產(chǎn)生十進分數(shù),即小數(shù)的概念。
第一個將這一概念用文字表達出來的是魏晉時代的劉徽。他在計算圓周率的過程中,用到尺、寸、分、厘、毫、秒 、忽等7個單位;對于忽以下的更小單位則不再命名,而統(tǒng)稱為“微數(shù)”。
到了宋、元時代,小數(shù)概念得到了進一步的普及和更明確的表示。楊輝《日用算法》(1262年)載有兩斤換算 的口訣:“一求,隔位六二五;二求,退位一二五”,即1/16=0?0625;2/16=0?125。
這里的“隔位”、“退位”已含有指示小數(shù)點位置的意義。秦九韶則將單位注在表示整數(shù)部分個位的籌碼之下,例如: —Ⅲ—Ⅱ表示13.12寸 寸是世界上最早的小數(shù)表示法。
在歐洲和伊斯蘭國家,古巴比倫的六十進制長期以來居于統(tǒng)治地位,一些經(jīng)典科學著作都是采用六十進制,因此十進制小數(shù)的概念遲遲沒有發(fā)展起來。15世紀中亞地區(qū)的阿爾卡西(?~1429)是中國以外第一個應用小數(shù)的人。
歐洲數(shù)學家直到16世紀才開始考慮小數(shù),其中較突出的是荷蘭人斯蒂文(1548~1620),他在《論十進制》(1583年)一書中明確表示法。例如把5.714記為:5◎7①1②4③或5,7'1''4'''。
而第一個把小數(shù)表示成今日世界通用的形式的人是德國數(shù)學家克拉維斯(1537~1612),他在《星盤》(1593年)一書中開始使用小數(shù)點作為整數(shù)部分與小數(shù)部分之間的分界符。 而中國比歐洲早采用了小數(shù)三百多年。
由于“編碼總位數(shù)為8”的限制,真值-128無法用原碼、反碼來表示,似乎不能用上述規(guī)則來求解補碼,但實際上是可行的——只要不管它的最高位即可,操作辦法如下:
將128化為二進制為:1 0000000,最高位為1,可以只對舍去最高位后剩余的7位進行處理即可,首先取反得:1111111,加1得:1 0000000,最高位有進位需丟棄,即得:0000000,加上符號位就得補碼:1 0000000。
又如,當編碼總位數(shù)為4時,真值X=+0.101的原碼、反碼、補碼均為:0 101。
真值X=-0.101的原碼、反碼、補碼依次為:1 101、1 010、1 011。
同理,特例,-1的補碼為:1 000。
在定點小數(shù)中,小數(shù)點隱含在第一位編碼和第二位編碼之間
定點小數(shù),是指小數(shù)點準確固定在數(shù)據(jù)某個位置上的小數(shù),從實用角度看,都把小數(shù)點固定在最高數(shù)據(jù)位的左邊,小數(shù)點前邊再設(shè)一位符號位。按此規(guī)則,任何一個小數(shù)都可以被寫成 :
N = NS . N-1 N-2 … N-M
如果在計算機中用m+1個二進制位表示上述小數(shù),則可以用最高(最左)一個二進制位表示符號(如用0表示正號,則1就表示負號),而用后面的m個二進制位表示該小數(shù)的數(shù)值。小數(shù)點不用明確表示出來,因為它總是固定在符號位與最高數(shù)值位之間,已成定論。定點小數(shù)的取值范圍很小,對用m+1個二進制位的小數(shù)來說,其值的范圍為:
|N| ≤ 1-2^(-m) 即小于1的純小數(shù),這對用戶算題是十分不方便的,因為在算題前,必須把要用的數(shù),通過合適的 比例因子化成絕對值小于1的小數(shù),并保證運算的中間和最終結(jié)果的絕對值也都小于1,在輸出真正結(jié)果時,還要把計算的結(jié)果按相應比例加以擴大。
定點小數(shù)表示法,主要用在早期的計算機中,它最節(jié)省硬件。隨著計算機硬件成本的大幅度降低,現(xiàn)代的通用計算機都被設(shè)計成能處理與計算多種類型數(shù)值的計算機。我們將主要通過定點小數(shù)討論數(shù)值數(shù)據(jù)的不同編碼方案,而且,定點小數(shù)也被用來表示浮點數(shù)的尾數(shù)部分。
如果是簡單的小數(shù),假如用于表示錢數(shù)的,小數(shù)位兩位
那么就可以把所有數(shù)字都乘100,然后都變成整數(shù),然后最后輸出的時候,你記得里面是有兩位小數(shù)就行了,直接表示出來。
如果是專業(yè)的小數(shù)計算,那就要用到數(shù)字的浮點表示法,
原理是在幾個字節(jié)的表示中,有的二進制用來表示數(shù)據(jù)的有效位,有的二進制位用來表示這個數(shù)字的小數(shù)的位數(shù),有的用來表示符號。
有點類似科學計數(shù)法,所有的數(shù)字都是0.abcEXY 比如0.25E3=250
二進制的表示都是0.1XXX,所以,前面的1都省略,
你可以查一下計算機原理,有詳細的浮點數(shù)表示法
在匯編里,也有浮點數(shù)運算語句
Java 語言支持兩種基本的浮點類型: float 和 double ,以及與它們對應的包裝類 Float 和 Double 。
它們都依據(jù) IEEE 754 標準,該標準為 32 位浮點和 64 位雙精度浮點二進制小數(shù)定義了二進制標準。 IEEE 754 用科學記數(shù)法以底數(shù)為 2 的小數(shù)來表示浮點數(shù)。
IEEE 浮點數(shù)用 1 位表示數(shù)字的符號,用 8 位來表示指數(shù),用 23 位來表示尾數(shù),即小數(shù)部分。作為有符號整數(shù)的指數(shù)可以有正負之分。
小數(shù)部分用二進制(底數(shù) 2)小數(shù)來表示,這意味著最高位對應著值 ?(2 -1),第二位對應著 ?(2 -2),依此類推。對于雙精度浮點數(shù),用 11 位表示指數(shù),52 位表示尾數(shù)。
IEEE 浮點值的格式如圖 1 所示。 圖 1. IEEE 754 浮點數(shù)的格式 因為用科學記數(shù)法可以有多種方式來表示給定數(shù)字,所以要規(guī)范化浮點數(shù),以便用底數(shù)為 2 并且小數(shù)點左邊為 1 的小數(shù)來表示,按照需要調(diào)節(jié)指數(shù)就可以得到所需的數(shù)字。
所以,例如,數(shù) 1.25 可以表示為尾數(shù)為 1.01,指數(shù)為 0: (-1) 0*1.01 2*2 0 數(shù) 10.0 可以表示為尾數(shù)為 1.01,指數(shù)為 3: (-1) 0*1.01 2*2 3 特殊數(shù)字 除了編碼所允許的值的標準范圍(對于 float ,從 1.4e-45 到 3.4028235e+38),還有一些表示無窮大、負無窮大、-0 和 NaN(它代表“不是一個數(shù)字”)的特殊值。這些值的存在是為了在出現(xiàn)錯誤條件(譬如算術(shù)溢出,給負數(shù)開平方根,除以 0 等)下,可以用浮點值集合中的數(shù)字來表示所產(chǎn)生的結(jié)果。
這些特殊的數(shù)字有一些不尋常的特征。例如, 0 和 -0 是不同值,但在比較它們是否相等時,被認為是相等的。
用一個非零數(shù)去除以無窮大的數(shù),結(jié)果等于 0 。特殊數(shù)字 NaN 是無序的;使用 == 、 運算符將 NaN 與其它浮點值比較時,結(jié)果為 false 。
如果 f 為 NaN,則即使 (f == f) 也會得到 false 。如果想將浮點值與 NaN 進行比較,則使用 Float.isNaN() 方法。
表 1 顯示了無窮大和 NaN 的一些屬性。 表 1. 特殊浮點值的屬性 表達式 結(jié)果 Math.sqrt(-1.0) -> NaN 0.0 / 0.0 -> NaN 1.0 / 0.0 -> 無窮大 -1.0 / 0.0 -> 負無窮大 NaN + 1.0 -> NaN 無窮大 + 1.0 -> 無窮大 無窮大 + 無窮大 -> 無窮大 NaN > 1.0 -> false NaN == 1.0 -> false NaN false NaN == NaN -> false 0.0 == -0.01 -> true 基本浮點類型和包裝類浮點有不同的比較行為 使事情更糟的是,在基本 float 類型和包裝類 Float 之間,用于比較 NaN 和 -0 的規(guī)則是不同的。
對于 float 值,比較兩個 NaN 值是否相等將會得到 false ,而使用 Float.equals() 來比較兩個 NaN Float 對象會得到 true 。造成這種現(xiàn)象的原因是,如果不這樣的話,就不可能將 NaN Float 對象用作 HashMap 中的鍵。
類似的,雖然 0 和 -0 在表示為浮點值時,被認為是相等的,但使用 Float.compareTo() 來比較作為 Float 對象的 0 和 -0 時,會顯示 -0 小于 0 。 浮點中的危險 由于無窮大、NaN 和 0 的特殊行為,當應用浮點數(shù)時,可能看似無害的轉(zhuǎn)換和優(yōu)化實際上是不正確的。
例如,雖然好象 0.0-f 很明顯等于 -f ,但當 f 為 0 時,這是不正確的。還有其它類似的 gotcha,表 2 顯示了其中一些 gotcha。
表 2. 無效的浮點假定 這個表達式…… 不一定等于…… 當…… 0.0 - f -f f 為 0 f = g) f 或 g 為 NaN f == f true f 為 NaN f + g - g f g 為無窮大或 NaN 舍入誤差 浮點運算很少是精確的。雖然一些數(shù)字(譬如 0.5 )可以精確地表示為二進制(底數(shù) 2)小數(shù)(因為 0.5 等于 2 -1),但其它一些數(shù)字(譬如 0.1 )就不能精確的表示。
因此,浮點運算可能導致舍入誤差,產(chǎn)生的結(jié)果接近 ― 但不等于 ― 您可能希望的結(jié)果。例如,下面這個簡單的計算將得到 2.600000000000001 ,而不是 2.6 : double s=0; for (int i=0; i<26; i++) s += 0.1; System.out.println(s); 類似的, .1*26 相乘所產(chǎn)生的結(jié)果不等于 .1 自身加 26 次所得到的結(jié)果。
當將浮點數(shù)強制轉(zhuǎn)換成整數(shù)時,產(chǎn)生的舍入誤差甚至更嚴重,因為強制轉(zhuǎn)換成整數(shù)類型會舍棄非整數(shù)部分,甚至對于那些“看上去似乎”應該得到整數(shù)值的計算,也存在此類問題。例如,下面這些語句: double d = 29.0 * 0.01; System.out.println(d); System.out.println((int) (d * 100)); 將得到以下輸出:0.29 28 這可能不是您起初所期望的。
浮點數(shù)比較指南 由于存在 NaN 的不尋常比較行為和在幾乎所有浮點計算中都不可避免地會出現(xiàn)舍入誤差,解釋浮點值的比較運算符的結(jié)果比較麻煩。最好完全避免使用浮點數(shù)比較。
當然,這并不總是可能的,但您應該意識到要限制浮點數(shù)比較。如果必須比較浮點數(shù)來看它們是否相等,則應該將它們差的絕對值同一些預先選定的小正數(shù)進行比較,這樣您所做的就是測試它們是否“足夠接近”。
(如果不知道基本的計算范圍,可以使用測試“abs(a/b - 1) < epsilon”,這種方法比簡單地比較兩者之差要更準確)。甚至測試看一個值是比零大還是比零小也存在危險 ―“以為”會生成比零略大值的計算事實上可能由于積累的舍入誤差會生成略微比零小的數(shù)字。
NaN 的無序性質(zhì)使得在比較浮點數(shù)時更容易發(fā)生錯誤。當比較浮點數(shù)時,圍繞無窮大和 NaN 問題,一種避免 gotcha 的經(jīng)驗法則是顯式地測試值的有效性,而不是試圖排除無效值。
在清單 1 中,有兩個可能的用于特性的 setter 的實現(xiàn),該。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學習鳥. 頁面生成時間:3.178秒