浮點型表示不準確,為什麼浮點數不能精確表示 知乎

時間 2022-09-20 09:00:02

1樓:男人

因為二進位制轉換出現的這個問題,你可以用bigdecimal

c語言中浮點數為什麼不能準確儲存?

2樓:匿名使用者

浮點數,即雙精度double型或單精度float型,拿雙精度的double來說,定義一個double型的變數,如 double a;那麼a在記憶體中開闢了一個32位的空間來儲存變數a,但是你要儲存變數a,計算機要將浮點數a用一個定點整數和一個定點小數表述,在對階碼的時候,由於各個計算機cpu的字長不一樣,可能造成對階時產生小數部分丟失,這樣造成了儲存不準確。建議看看組成原理。

3樓:司空皇甫

有效位內是準確的,有效位之外就會在一個範圍內浮動,幅度有多大就不知道了

4樓:鄞翠

這個我也不知道哎 好像預設的浮點熟只有2位吧 後面的不是四捨五入 是直接去掉了

為什麼浮點數不能精確表示 知乎

5樓:小罍神

因為二進位制只能表示2的n次方的數,n可以取負值,3.3無法用2的n次方的陣列合計算出來,所以無法精確表示:3.

3=1*2+1*1+0*1/2+1*1/4+0*1/8+0*1/16+1*1/32+...

其中分式的分母只能是2的倍數(二進位制所限),3.3的二進位制表示是11.01001.....

有些數比如1/3就無法精確計算,只能無限逼近

浮點型誤差的問題

6樓:匿名使用者

那是因為浮點數精度問題

50.2和51.2都不能被準確的表示

其中50.2的最近能表示的浮點數是

50.200000762939453

51.2則是

51.200000762939453

所以在四捨五入的時候就會列印出

51.200001

11.2同樣不能被精確表示

近似表示是

12.100000381469727

四捨五入列印以後就是

12.100000

7樓:匿名使用者

這個程式你是不需要去執行的,鑽了牛角尖了,因為這個程式的寫法就是不允許的,放在書本中僅僅只是為了告訴你不要去這樣寫,這樣寫機器無法執行出正確的答案,根本就毫無意義。

至於在不同的軟體中執行得到的結果不一樣,正如樓上所說,兩種軟體的編譯方式不一樣

為什麼j**ascript浮點數運算有時準確,有時不準確 30

8樓:匿名使用者

你試試看 0.1 + 0.7,也是一樣有精度丟失的

例如 0.1 + 0.1,在 js 下用直接輸出是 0.2,然而這只是因為預設情況下直接輸出的話是有 17 位小數的,然而誤差出現在 17 位小數之後。。。

0.1 + 0.1 在 20 位小數的情況下是 0.20000000000000001110

浮點數精度有誤差為什麼在我們日常計算器體現不出來

9樓:匿名使用者

首先您要明白,數字在計算機(器)中是以二進位制來表示的。以float型別來說,其一般是32位的,即由32個二進位制的數字來表示一個float,而一般的計算器在表示浮點數時,其位數可能小於32,因此造成浮點數的小數部分的精度沒那高!

10樓:

計算器可能使用了整型來表示小數,而不是浮點型

11樓:匿名使用者

是計算器本身給的記憶體問題

關於浮點型資料的疑惑

12樓:

*****float型在記憶體中佔4個位元組,即32位,同樣int或long型也佔4個位元組,在對各自的32位進行逐位分解後發現,它們所代表的具體意義卻相差甚遠。

*****首先分解整形的32位,對於無符號整形(unsigned int) ,分解如下:至右向左把第i位的值記為bi(0或1),則這一位代表的十進位制數值為:bi * 2^i, i=0,2,...

31。整形的4個位元組(32位)二進位制數折算成十進位制數為:b31 * 2^31 + ...

+ bi * 2^i + ... + b1 * 2 + b0 * 1 ——記為「公式@」。

*****對於有符號整形(signed int),最高位(第31位)代表符號,0正1負,剩餘的31位必須減1再各位取反,記為「操作#」,然後按以上「公式@」得出這個整形數的絕對值。

*****以上作為一個引子,以下float分解也必須建立在此基礎上,記住「操作#」和「公式@」兩個約定的含義。同時糾正一下提問者的說法「能表達的範圍應該也就0-2^32」,整型準確的數值範圍為:有符號( (-2^31) —— (2^31-1)),無符號( 0 —— (2^32-1) )。

下面引導到關鍵問題上,float的32位在記憶體中到底分別代表什麼意義?

*****把所有32位用b31-b0(從高到低)表示,b31同樣是符號位,其意義為0正1負。b30-b23總共8位是一個有符號整形(signed int),先後用「操作#」和「公式@」計算得到一個數值e (十進位制範圍是-128 —— 127),再由它經過指數運算得到2^e,十進位制範圍是:1.

0 * 10^(-38) —— 1.7 * 10^38 。餘下的23位b22-b0代表小數值,其中b22代表的十進位制數值為:

b22 * 2^(-1)即b22 * 0.5, b21代表的十進位制數值為:b22 * 2^(-2)即b22 * 0.

25,以此類推,所以小數範圍為0 —— 1(實際為0.0000…1 至 0.9999…) 。

*****從以上分解可知,float的32位都有了各自的意義,可以分為3塊,符號塊s (b31),指數塊e (b30-b23),小數塊d(b22-b0),但如何組裝成一個實際的小樹呢?具體演算法就是:

(-1)^s * (1.0 + d) * 2^e ,最終數值範圍是-3.4*10^-38 —— 3.4*10^38。

*****最後提醒一下,所有浮點數在進出記憶體時都經過相應的硬體進行以上「操作#」和「公式@」。程式設計人員無需深究其中細節,如若是出於好奇心,那是值得理解並支援地。

13樓:匿名使用者

浮點數的儲存方式是用指數形式儲存的,

32位浮點數格式為:

s × × × × × × × eb

× × × × × × × × by0

× × × × × × × × by1

× × × × × × × × by2

其中:×表示一位二進位制數0或1;eb 為指數的偏差;s為浮點數的符號位,s=0為正數,s=1為負數;小數點「·」在eb的右邊;by0 by1 by2為尾數的小數部分。浮點數隱含其整數部分為1。

14樓:匿名使用者

浮點數的機內表示法建議去檢視一下《計算機組成原理》,對於你的問題會有很大的幫助。

大概說一下,浮點數是表示成

(+/-)2^e*m

2的e次冪乘尾數m,m是純小數

如果32位浮點數用1位符號8位冪(冪也有1位符號)23位尾數,則它的範圍是(括號中為二進位制數)

-2^(1111111)*(0.1111…1) 至 2^(1111111)*(0.1111…1)

我們使用的cpu實際使用浮點數形式也許不大一樣,但原理是相同的

c語言浮點數的儲存方式?為何浮點數儲存不準確?那個**是什麼意思?

15樓:匿名使用者

c語言中,無論是單精度還是雙精度在儲存中都分為三個部分:

1. 符號位(sign) : 0代表正,1代表為負2.

指數位(exponent)(注:也叫階碼):用於儲存科學計數法中的指數資料,並且採用移位儲存(注:

移碼編碼表示)

3. 尾數部分(mantissa):尾數部分關於不精確是由於十進位制小數部分化二進位制,常常化不盡。如同無限迴圈小數,最後有截斷誤差。

**中的是float型的變數的儲存上的格式。

16樓:匿名使用者

圖中已經說明了。

這是一個單精度浮點數。

每個單精度浮點數佔用四個位元組記憶體空間。這四個位元組在內部有不同的功能。

四個位元組一共由32位。

計算機中的浮點數就是指數學中的科學記數法。不過計算機中儲存二進位制,而科學記數法是10進位制的。

+1.34534534×10^3(用^後面的3表示10的冪)其中,第0位到22位,表示尾數,就是用於1.34534534的部分。

第23位到30位,表示指數,用於儲存3。

第31位,表示符號位,用於儲存符號。

浮點數儲存不精確,在於計算不結果不精確。

這種計算不精確,不在於計算本身,而在於浮點數表示範圍是有限的,當計算結果大於或小於浮點數表示範圍時,它實際儲存結果出現問題。

舉個例子,

讓你計算325+925。結果只能儲存三位數,最終應該是多少?肯定不是1250了,因為它是四位數。

什麼是浮點數,浮點數表示方法是什麼?

浮點數是表示小數的一種方法。所謂浮點就是小數點的位置不固定,與此相反有定點數,即小數點的位置固定。整數可以看做是一種特殊的定點數,即小數點在末尾。8086 8088中沒有浮點數處理指令,不過從486起,cpu內建了浮點數處理器,可以執行浮點運算。一般的浮點數有點象科學計數法,包括符號位 指數部分和尾...

浮點數的表示範圍,浮點數所能表示的數值範圍和精度取決於什麼

最常用的32位規格化浮點數的表示範圍是 前提條件 階碼用移碼錶示,尾數用補碼錶示,每1位是符號位,階碼佔8位,尾數佔23位 可表示的最大正數 1 2 23 2 127最小正數 2 129 最大負數 2 129 最小負數 2 127 呵呵,不同的編譯環境下,浮點數的範圍是不同的 目前多數系統都按照ie...

c中double用來表示雙精度浮點數,請問 什麼是雙精度浮點數啊

雙精度浮點數 double 用來表示帶有小數部分的實數,一般用於科學計算,用8個位元組 64位 儲存空間,其數值範圍為1.7e 308 1.7e 308,雙精度浮點數最多有15或16位十進位制有效數字,雙精度浮點數的指數用 d 或 d 表示。雙精度浮點數科學記數法格式 ad c或 ad c 在一些現...