亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

浮點比較。

浮點比較。

C++
喵喵時光機 2019-06-24 17:02:33
浮點比較。int main(){     float a = 0.7;     float b = 0.5;     if (a < 0.7)     {        if (b < 0.5) printf("2 are right");        else         printf("1 is right");     }     else printf("0 are right");}我原以為這段代碼的輸出是0 are right..但令我沮喪的是1 is right為什么?
查看完整描述

3 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

int main(){
    float a = 0.7, b = 0.5; // These are FLOATS
    if(a < .7)              // This is a DOUBLE
    {
      if(b < .5)            // This is a DOUBLE
        printf("2 are right");
      else
        printf("1 is right");
    }
    else
      printf("0 are right");}

在比較中,浮點數被提升為雙倍,由于浮點數比雙面浮點數低,所以0.7和浮點數一樣等于0.7倍。在這種情況下,0.7作為浮動變得低于0.7倍,當它得到提升。正如克里斯蒂安所說,0.5為2的冪總是被精確地表示出來,所以測試工作就像預期的那樣:0.5 < 0.5都是假的。

所以要么:

  • 變化

    float

    double

    ,或:
  • 變化

    .7

    .5

    .7f

    .5f,

你就會得到預期的行為。


查看完整回答
反對 回復 2019-06-24
?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

問題是,您要比較的常量是doublefloat..此外,將常量更改為易于表示的內容,例如5會讓它說0 is right..例如,

main(){
    float a=0.25,b=0.5; 
    if(a<.25) 
       {
       if(b<.5) 
               printf("2 are right");
       else
               printf("1 is right");
       }elseprintf("0 are right");}

產出:

0 are right

這個問題浮動和雙比對最有效的方法包括這個話題。

另外,這篇文章在天鵝座浮點數比較給我們一些提示:

ieee浮點數和雙格式的設計使得這些數字是“按字典順序排列的”,用ieee Architect william kahan的話來說,意思是“如果兩個相同格式的浮點數字被排序(例如x<y),那么當它們的位被重新解釋為符號大小整數時,它們的排序方式是相同的。”

這意味著,如果我們在內存中使用兩個浮點數,將它們的位模式解釋為整數,并將它們進行比較,我們就可以判斷哪個更大,而無需進行浮點比較。在C/C+語言中,這種比較如下所示:

if (*(int*)&f1 < *(int*)&f2)

這種迷人的語法意味著獲取F1的地址,將其視為整數指針,并取消對它的引用。所有這些指針操作看起來都很昂貴,但是它們基本上都是抵消掉的,只是意味著‘把F1當作一個整數’。由于我們對f2應用相同的語法,整行的意思是‘比較f1和f2,使用它們的內存中表示形式解釋為整數而不是浮點數’。


查看完整回答
反對 回復 2019-06-24
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

一般來說,將等式與浮點數進行比較是一項危險的工作(這實際上是你正在做的事情,就像在>的邊界上進行比較一樣),請記住,在十進制中,某些分數(如1/3)不能精確表示,二進制也是如此,

0.5= 0.1,在浮動或雙倍上都是一樣的。

0.7=0.10110011001100等等,0.7不能完全用二進制表示,您會得到舍入錯誤,浮動和雙值之間可能會有(很小的)不同

請注意,在浮動和雙倍之間,您將減少不同的小數位數,因此您的結果不一致。


查看完整回答
反對 回復 2019-06-24
  • 3 回答
  • 0 關注
  • 446 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號