int i=25;
double j=(double)i;
是否有機會j
將值24.9999999..upto_allowed
或25.00000000..._upto_allowed_minus_one_and_then_1
。我記得讀過這樣的東西,但無法正確回憶。
換句話說:
是否有一個情況下,當鑄造增加一倍時整失去了它的精確度?
int i=25;
double j=(double)i;
是否有機會j
將值24.9999999..upto_allowed
或25.00000000..._upto_allowed_minus_one_and_then_1
。我記得讀過這樣的東西,但無法正確回憶。
換句話說:
是否有一個情況下,當鑄造增加一倍時整失去了它的精確度?
對於像25
這樣的小號碼,你很好。對於int
爲64位(其值不能用53位表示)的體系結構上的非常大(絕對)值爲int
時,您將失去精度。
Double precision floating point number具有53位的精度,其中最重要的位通常是(隱含地)1
。
在浮點表示不是IEEE-754的平臺上,答案可能有點不同。有關更多詳細信息,請參閱C99/C11規範的5.2.4.2.2章節
那個'建築物'是我正在尋找的..我現在看到了這一點.. – sjsam
謝謝@chux,完成了。 –
'int'只有32位是錯誤的語句。抱歉。 –
比以前好一點。當「int」是16-32(或53)位和更大時,你應該覆蓋這兩種情況。那麼我會很樂意收回我的投票。 –
我想你還需要提供一個鏈接到該圖表的來源。 – user3386109
@Mohit Jain答案適用於實際編碼。
按C規格,DBL_DIG
或FLT_RADIX/DBL_MANT_DIG
和INT_MAX/INT_MIN
是重要的值。
DBL_DIG
最大十進制數字數字可以有這個時,轉換爲double
和後面肯定會有相同的值。這是至少 10.所以像9,999,999,999這樣的整數肯定可以轉換爲double
,並返回而不會丟失精度。可能的更大值也可以順利地往返。
真正的往返問題以超過+/-power(FLT_RADIX, DBL_MANT_DIG)
的整數值開始。 FLT_RADIX
是浮點基數(並且絕大部分是2
),DBL_MANT_DIG
是「浮點數有效數字中基數 - FLT_RADIX
數字」,例如帶有IEEE-754 binary64的53
。當然,int
的範圍爲[INT_MIN ... INT_MAX]
。範圍必須是至少 [-32767 ... + 32,767]。
在數學上,power(FLT_RADIX, DBL_MANT_DIG) >= INT_MAX
沒有轉換問題。這適用於所有符合的C編譯器。
請解釋你的問題更容易理解。 –
這取決於。大多數計算機使用[IEEE 754](https://en.wikipedia.org/wiki/IEEE-754)浮點數,其中-2,53和2之間的整數被精確表示。在ILP32和LP64體系結構(大多數32位和64位體系結構)中,「int」是32位,這意味着「double」類型可以精確地表示所有的「int」值。 –
@AdalarasanSachithanantham:對不起有點混亂。查看編輯。 – sjsam