第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

浮點(diǎn)數(shù)與浮點(diǎn)文字比較中的奇怪輸出

浮點(diǎn)數(shù)與浮點(diǎn)文字比較中的奇怪輸出

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

4 回答

?
Cats萌萌

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊

這是因?yàn)樵谀愕年愂鲋?/trans>

  if(f == 0.7)

0.7被視為雙倍。嘗試0.7F以確保將該值視為浮點(diǎn)數(shù):

  if(f == 0.7f)

但是,正如Michael在下面的評(píng)論中所建議的,您永遠(yuǎn)不應(yīng)該測(cè)試浮點(diǎn)值的確切相等性。


查看完整回答
反對(duì) 回復(fù) 2019-06-01
?
米脂

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊

這個(gè)答案是對(duì)現(xiàn)有答案的補(bǔ)充:請(qǐng)注意,0.7既不能準(zhǔn)確地表示為浮點(diǎn)數(shù)(也不能表示為雙值)。如果它被準(zhǔn)確地表示,那么在轉(zhuǎn)換為浮動(dòng),然后返回到雙倍時(shí)不會(huì)丟失信息,這樣就不會(huì)有這個(gè)問(wèn)題了。

甚至可以說(shuō),對(duì)于不能準(zhǔn)確表示的文字浮點(diǎn)常量,應(yīng)該有一個(gè)編譯器警告,特別是當(dāng)標(biāo)準(zhǔn)對(duì)于在運(yùn)行時(shí)是在已設(shè)置為該時(shí)間的模式下進(jìn)行舍入,還是在編譯時(shí)在另一個(gè)舍入模式下進(jìn)行的時(shí)候。

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


查看完整回答
反對(duì) 回復(fù) 2019-06-01
?
小唯快跑啊

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊

正如其他評(píng)論者所指出的,您面臨的問(wèn)題是,測(cè)試浮點(diǎn)數(shù)之間的確切等效性通常是不安全的,因?yàn)槌跏蓟e(cuò)誤或計(jì)算中的舍入錯(cuò)誤可能會(huì)引入一些細(xì)微的差異,從而導(dǎo)致=操作符返回false。

更好的做法是做類(lèi)似的事情

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

假設(shè)Flt_Epsilon已被定義為平臺(tái)的適當(dāng)小浮點(diǎn)數(shù)。

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


查看完整回答
反對(duì) 回復(fù) 2019-06-01
?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊

網(wǎng)絡(luò)上的許多答案都錯(cuò)誤地考慮了浮點(diǎn)數(shù)之間的上述差異,這僅適用于特殊情況,穩(wěn)健的方法是查看相對(duì)差異,如下所示:

      // 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;

        }


查看完整回答
反對(duì) 回復(fù) 2019-06-01
  • 4 回答
  • 0 關(guān)注
  • 584 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)