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

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

std:map中的浮點鍵

std:map中的浮點鍵

C++
慕哥9229398 2019-12-03 14:38:12
以下代碼應3.0在std::map存在的密鑰中找到密鑰。但是由于浮點精度,將無法找到它。map<double, double> mymap;mymap[3.0] = 1.0;double t = 0.0;for(int i = 0; i < 31; i++){  t += 0.1;  bool contains = (mymap.count(t) > 0);}在上面的示例中,contains將始終為false。我當前的解決方法是乘以t0.1而不是加0.1,如下所示:for(int i = 0; i < 31; i++){  t = 0.1 * i;  bool contains = (mymap.count(t) > 0);}現在的問題是:std::map如果我使用double鍵,是否可以將FuzzyCompare引入?浮點數比較的常見解決方案通常是a-b < epsilon。但是我看不到使用來實現此目的的簡單方法std::map。我是否真的必須將double類型封裝在類中并重寫operator<(...)才能實現此功能?
查看完整描述

3 回答

?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

您可以實現自己的比較功能。


#include <functional>


class own_double_less : public std::binary_function<double,double,bool>

{

public:

  own_double_less( double arg_ = 1e-7 ) : epsilon(arg_) {}

  bool operator()( const double &left, const double &right  ) const

  {

    // you can choose other way to make decision

    // (The original version is: return left < right;) 

    return (abs(left - right) > epsilon) && (left < right);

  }

  double epsilon;

};

// your map:

map<double,double,own_double_less> mymap;


查看完整回答
反對 回復 2019-12-03
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

這是使用軟比較(又稱epsilon或幾乎相等)如何導致問題的簡化示例。


讓我們epsilon = 2為簡單起見。把1和4到您map?,F在看起來像這樣:


1

 \

  4

所以,1是樹的根。


現在,擺在數2,3,4的順序。每個都將替換根,因為它與根相等。所以你有


4

 \

  4

已經壞了 (假設沒有試圖重新平衡樹而成。)我們可以跟上去5,6,7:


7

 \

  4

甚至更糟,因為現在如果我們詢問是否4在其中,它會說“ no”,并且如果我們要求一個小于的值的迭代器7,則不會包含4。


盡管我必須說,我過去曾map多次使用基于此模糊比較運算符的s,而且每當我發現一個bug時,都不會因此而來。這是因為我的應用程序區域中的數據集實際上從不構成壓力測試此問題的方法。


查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 968 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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