簡體   English   中英

N.0 == N &&(int)N.0 == N`是真的嗎,其中N是int范圍內的整數?

[英]Is `N.0 == N && (int)N.0 == N` true where `N` is an integer literal in the range of int?

N.0 == N && (int)N.0 == N真的嗎,其中Nint范圍內的int

總的來說是真的還是假的?

如果將N.0重寫為(double) NN.0得到以下結果:

(double) N == N && (int) (double) N == N

然后,我們可以將隱式轉換成顯式強制轉換:

(double) N == (double) N && (int) (double) N == N

顯然, (double) N == (double) N始終為真。 因此,第二個平等可能失敗。

假設int是64位,而double是IEEE的double。 然后有int不能表示為double (例如2 53 +1),從而使命題為假。 具有64位int系統很少見,但它們存在。 在此,使^表示冪。

(int) (double) (2^53 + 1) == 2^53 + 1
(int) (2^53) == 2^53 + 1
2^53 == 2^53 + 1
false

如果已知int是32位並且double是IEEE double,那么該命題始終是正確的,因為在這些系統中所有int都可以精確地表示為double

擴展精度

chux指出,對於N.0 ,編譯器可以自由使用大於doubleN.0 如果此類型能夠表示所有int ,則該命題將為真。 想象一下,該類型稱為long double

(long double) N == (long double) N && (int) (long double) N == N
//                 ^^^^^^^^^^^^^ implicit conversion

注意,隱式轉換現在必須是到long double的轉換,因為這是==的規則。 結果是,對於不能使用浮點類型表示的N ,左手等式始終始終為true,而右手等式仍為false。

摘要

命題是:

  • 如果所有int都可表示為double則為true

  • 否則,如果常量使用擴展精度,則為true ,並且所有int均可使用該類型表示。

  • 否則,為false

我正在“解析”您的問題的意思是:

Given C99 (or C11)

Are there C integer literal values for N such that:

N.0 == N && (int)N.0 == N 
 ^                ^           'N' with a '.0' making it a double literal
       ^                ^     'N' as a standalone C int literal
              ^               cast the double literal to an int

在某些情況下,這是不正確的。

  1. 任何時候只要整數大於float的有效位數表示形式

    一種。 Cray實現64位整數和64位浮點數和雙精度值 Cray還實現IEEE或浮點數的專有表示形式。

    b。 因為64個IEEE浮點數只有52位十進制數,所以任何其他使用ILP64為其64位模型和64個IEEE浮點數的系統。

  2. 如果您閱讀C11標准的 §6.4.4.1,則該示例語句為true時,會有許多N文字值:

    一種。 int文字不支持int文字的合法文字(其中有很多,例如0x1.0p31是合法的整數文字,而0x1.0p31.0則不是合法的雙重文字)

    b。 0123是八進制文字,但0123.0是以10為底的雙0123.0文字,並且顯然不相等(感謝突突)

    C。 整數升可以是合法的,也可以大於分配的值。 整數文字可以大於int或double的分配值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM