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

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

浮點數與浮點文字比較中的奇怪輸出

浮點數與浮點文字比較中的奇怪輸出

C++ C
梵蒂岡之花 2019-06-01 14:38:28
浮點數與浮點文字比較中的奇怪輸出float f = 0.7;if( f == 0.7 )     printf("equal");else     printf("not equal");為什么輸出not equal ?這一切為什么要發生?
查看完整描述

4 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

這是因為在你的陳述中

  if(f == 0.7)

0.7被視為雙倍。嘗試0.7F以確保將該值視為浮點數:

  if(f == 0.7f)

但是,正如Michael在下面的評論中所建議的,您永遠不應該測試浮點值的確切相等性。


查看完整回答
反對 回復 2019-06-01
?
米脂

TA貢獻1836條經驗 獲得超3個贊

這個答案是對現有答案的補充:請注意,0.7既不能準確地表示為浮點數(也不能表示為雙值)。如果它被準確地表示,那么在轉換為浮動,然后返回到雙倍時不會丟失信息,這樣就不會有這個問題了。

甚至可以說,對于不能準確表示的文字浮點常量,應該有一個編譯器警告,特別是當標準對于在運行時是在已設置為該時間的模式下進行舍入,還是在編譯時在另一個舍入模式下進行的時候。

所有可以精確表示的非整數都有5作為他們的最后一個十進制數字。不幸的是,相反的情況并非如此:有些數字5作為他們的最后一個十進制數,不能被精確地表示。小整數都可以精確地表示,除以2的冪可以將一個可以表示的數字轉換成另一個可以表示的數字,只要你不進入非正態數的范圍。


查看完整回答
反對 回復 2019-06-01
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

正如其他評論者所指出的,您面臨的問題是,測試浮點數之間的確切等效性通常是不安全的,因為初始化錯誤或計算中的舍入錯誤可能會引入一些細微的差異,從而導致=操作符返回false。

更好的做法是做類似的事情

float f = 0.7;if( fabs(f - 0.7) < FLT_EPSILON )
    printf("equal");else
    printf("not equal");

假設Flt_Epsilon已被定義為平臺的適當小浮點數。

由于舍入或初始化錯誤不太可能超過Flt_Epsilon的值,這將為您提供您正在尋找的可靠的等效測試。


查看完整回答
反對 回復 2019-06-01
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

網絡上的許多答案都錯誤地考慮了浮點數之間的上述差異,這僅適用于特殊情況,穩健的方法是查看相對差異,如下所示:

      // Floating point comparison:

        bool CheckFP32Equal(float referenceValue, float value)
        {
           const float fp32_epsilon = float(1E-7);
           float abs_diff = std::abs(referenceValue - value);

           // Both identical zero is a special case
           if( referenceValue==0.0f && value == 0.0f)
              return true;

           float rel_diff = abs_diff / std::max(std::abs(referenceValue) , std::abs(value) ); 

           if(rel_diff < fp32_epsilon)
                 return true;
           else 
                 return false;

        }


查看完整回答
反對 回復 2019-06-01
  • 4 回答
  • 0 關注
  • 596 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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