為什麼執行後結果為0

時間 2021-11-03 21:44:01

1樓:逆轉未來2020

float的結果是0,double的結果是1先分析問題

若copy是float型,則表示式(int)copy / 10的值是整型,值為37

表示式( copy / 10 )的值是float型,值為37.1

所以根據資料型別的混合運算規則,表示式( copy / 10 - (int)copy / 10 )的值是float型,理論值為0.1

拓展:資料型別混合運算的隱式轉換C語言資料型別轉換(自動型別轉換+強制型別轉換)

若copy是double型,則表示式(int)copy / 10的值是整型,值為37

表示式( copy / 10 )的值是double型,值為37.1

所以根據資料型別的混合運算規則,表示式(copy / 10 - (int)copy / 10)的值是double型,理論值也為0.1

問題就出在這裡,

單精度型別(float)和雙精度型別(double)都是浮點型資料型別,可以用來表示浮點數。

但是(題主編譯環境:window+VS)float佔4個位元組(32bit),double佔8個位元組(64bit)。

拓展:

單精度資料或雙精度資料在計算機中儲存,都遵守IEEE標準都分為三個部分(S\E\M):

符號位(Sign):表示資料的正負;

指數字(Exponent):用於儲存科學計數法中的指數部分;

尾數字(Mantissa):用來儲存科學計數法中的尾數部分;

float資料型別

在32bit(0~31bit)中,符號位佔1bit(31bit),指數字佔8bit(23~30bit),尾數字佔23bit(0~22bit)

符號位指尾數的符號,正數為0,負數為1。

指數字占用8bit的二進位制數,可表示數值範圍為0-255。

但是指數可正可負,所以IEEE規定,此處算出的次方必須減去127才是真正的指數。

所以,float型別的指數為-126到128

尾數字理論是占用24bit的乙個值,但是最高位始終為1

(二進位制的科學計數法:浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是乙個隱含著的「1」)。

所以最高位省去不儲存,在實際儲存中佔23bit。

浮點數float型別的二進位制格式可以表示為:

SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

舉例:float型的28.125在記憶體中的儲存

首先要把28.125換算成二進位制:11100.001

用科學計數法表示:1.1100001 * 2^4

尾數字:因為小數點前必為1,所以IEEE規定只記錄二進位制的小數部分。所以此處的尾數為:1100001

指數字:實際上為4,儲存必須加上127,所以為131。即10000011

符號位:因為是正數,所以為0

綜上所述,28.125在記憶體中的儲存格式是:

01000001 11100001 00000000 00000000

double資料型別

在64bit(0-63bit)中,符號位佔1bit(63bit),指數字佔11bit(52-62bit),尾數字佔52bit(0-51bit),其他同理。

float和double的精度是由尾數的位數來決定的。

2 ^ 23 = 8388608,一共7位

這意味著最多能有7位有效數字,但絕對能保證只有6位。

即float的精度為6~7位,小數部分6~7位之後的是不確定的。

同理,2^52 = 4503599627370496,一共16位

這意味著最多能有17位有效數字,但絕對能保證只有16位

即double的精度為16~17位,小數部分16~17位之後的是不確定的。

可知double的精度比float的精度要高

所有資料在計算機中都是以二進位制形式儲存的, 理論值為0.1的數轉換成二進位制數是

(無限重複小數)

但在計算機中對資料的儲存的位數(bit)大小有要求,所以把浮點型的0.1儲存在計算機中會損失一定的精度,而float型損失的精度更大。因此,在計算機中double型的0.

1比float型的0.1更能表示真實值的0.1

當我們用十進位制列印float型和double型的0.1 (計算機自動進行四捨五入):

copy是float型

10 * (copy / 10 - (int)copy / 10) = 0.9

賦值給int型的add,值變成0

copy是double型

10 * (copy / 10 - (int)copy / 10) = 1

賦值給int型的add,值還是1

0 除以 0 為什麼沒有結果呢?那此時 0 為什麼不能做除數呢?

冰楓的第五小號 其實關鍵在於除法的定義與實現,所以說如果在這裡我給出一種能夠除以0的實現,比如說像這個 只適用於自然數 public static operatorint int left int right if i left break if i left return newint times...

為什麼程式執行時間總為0,是我的電腦太快了麼??

Sam Richard 用 std chrono high resolution clock 來計時,可以精確到us.auto t1 chrono high resolution clock now TODO auto t2 chrono high resolution clock now auto...

為什麼將 x m 代入多項式,若結果為 0,則必有 x m 這個因式?

格洛公尺 證明對於多項式函式 的充分必要條件是 充分性顯然,下面證明必要性 記 設 其中 為 的 次實係數多項式 因為 所以有 所以 所以 所以 證畢 SDLTF 用我們數學老師的話通俗的解釋一下,可能不是很嚴謹,稍微理解一下就行了 我記得這玩意在因式分解裡邊叫因式定理或者叫大除法什麼的,總之不到萬...