1樓:匿名使用者
補充:你可以這樣理解。
main()
按理說這句應該不會顯示那一堆00000000000000的 ,但是卻顯示了...
本來變數a應該為0的,由於誤差導致上面的if句成為:if(a=i),a不等於0了。
所以那句沒錯。(與源語句沒出入吧?)
你看到了結果,沒看到過程。
順便提下,不反對 可愛小爬爬大大的觀點。小數部分轉換成2進製是乘以2,進製置1的原則。小數乘以2,大部分永遠都不可能為一。如:0.456
0.456*2=0.912(沒進製,所以第一位是0):0
0.912*2=1.824(進製,第二位是1):01
1.824*2=3.648(進製,第三位是1):011
3.648*2=7.296(進製,第四位是1):0111
取15位0. 011101001011110(後面是無窮的)。
所以大多數情況下,小數是不可能精確表示的。
在幫她補充一點。爬爬說的位0,其實有兩種情況。
1:當乙個浮點數的尾數為0時(如2.0)(這種情況我認為是可以用==)
2:當階碼的值遇到比它能表示的最小值還小時(這是爬爬說的那種情況)
小數都是以類似科學計數法儲存的。這裡就不說了。
有興趣的可以baidu搜尋float記憶體儲存。
本不打算說這個的。但是小爬爬這一鬧...我不說就無知了。初學者知道這個沒什麼用。理解我所說的下面的和上面那一段就好。
main()
請看,本身if句條件是滿足的,應該輸出00000000
但是實際上是不可能輸出的。
為什麼呢?因為0.000000000000000000001在這裡被看成是0。
他說的誤差,不是0的誤差,是很小的小數的誤差。
main()
如果改成這樣就正確了(小於乙個很小的數)
乙個0儲存進去,的確怎麼搞輸出來也是0,但是0.00000000000000000000000001搞出來可能也成0了。誤差就在這。
2樓:鮮鈞
我說了啊,你的a定義的型別是float型,你不是定義的int型。而在計算機內部沒有浮點數的0.0,而是用乙個非常非常小的小數來表示0.
0,所以也不能用==來比較。原因就在這裡。
說實話,本不想來摻和。但是為正視聽,我覺得有義務發出聲音。
整數是可以精確比較的,比如
int a=0;
if(a==0)
...但是對於浮點數0.0在計算機內部不是真正的用0來表示,因為浮點數的表示方法和整數不同。
比如對於十進位制數0.1根據書上把十進位制表示成二進位制數的方法它的二進位制數是個無限小數,也就是說不是所有的十進位制數都可以精確的表示成二進位制數。而在計算機內部所有數值都是以二進位制數表示的,所以必須有乙個精度問題,即用一定精度的數值來近似表示。
這樣對於float a=0.1在計算機內部a的真正表示值不是0.1,而是它的乙個近似值(float一般精確到小數點以後第6位)所以有
float a=0.1;
if(fabs(a-0.1)<0.00001)...在計算機內部沒有浮點數的0.0,而是用乙個非常非常小的小數來表示0.0,所以也不能用==來比較。
可以參看下面的鏈結。
你一定明白了吧。
3樓:匿名使用者
如果直接寫0應該不會有錯.但資料一般是要用來進行運算的,進行浮點運算時,因計算機浮點數型別的精度不夠而導致某些過小的數被忽略掉,本應是0的結果會變成接近於0的小數,所以要用書上的這種方法.
比如下面的程式,我們能看出來結果是0,但0.0000000001太小了,float表示不了,所以實際程式並沒有顯示ok
#include
main ()
4樓:匿名使用者
零當然不同 在float a時給a分配了4位元組的儲存空間 而inta 就2位元組 int型的0 就是0 float 0是0.000000 還有在有的編碼中0還分+0和-0之分
5樓:匿名使用者
是a的絕對值小於a的負六次方
6樓:匿名使用者
應該是a==0吧,非要說的話,可以試下a==0.000000呵
7樓:匿名使用者
這是哪本書上說的 。真想看一下
c語言問題,C語言問題。
考驕 用指標將兩個字串連結接起來,前一個while迴圈,確定s1字串走完,第二個while開始將s1的逐個字元複製給s1走完,也就是末尾,這樣就可以把字串都匯入到s1中 最後一個空寫的應該寫return s1 長魚修韋 很久沒碰這東西了。我來解釋下 第一個while的迴圈是為了讓指標指向第一個字串的...
C語言問題,c語言問題?
自我程式設計 列印輸出乙個ok。因為前面迴圈for語句有分號結束。所以後面的printf語句不在迴圈內,不受迴圈語句影響。 理佑平鄲胭 結果是22 7 7 8 22 你可以將 i i i i是先 1再計算,還有這裡的運算順序是從左到右,所以應該是7 7 i 14 8 22 前兩個相加時,i先加1,加...
c語言問題,C語言問題?
這個問題說難不難,但理解可能有點玄乎而已,但是打個比方來理解就太容易掌握啦!就是說scanf的認定讀取,比如你單純的scanf c ch 那麼實際上已經認定了第乙個字元出現就把它賦予給ch,如果是你的scanf c 前面多了乙個空格,所以就認定了出現第乙個空格後的字元賦予給ch,如果寫成這樣 sca...