使用double作为std set / map中的键的方法

在映射/集合中使用双精度的问题是浮点精度。

有些人建议在你的比较函数中增加一个epsilon,但这意味着你的密钥将不再满足必要的严格弱排序标准。 这意味着您将根据插入元素的顺序获得不同的设置/地图。

如果你想基于double值聚合/合并/合并数据,并且愿意允许某个级别的rounding / epsilon(显然,你必须),下面的解决方案是一个好主意吗?

将所有双精度(我们打算用作关键点的精度)乘以精度因子(例如1e8)并舍入到最接近的整数(int)i+0.5 (如果i> 0),然后创建一个集合/映射关闭这些整数。 提取键的最终值时,将精度因子除以整数以得到双精度值(尽管舍入)。


“通过将所有双精度(我们打算用作关键字)转换为整数,方法是将它们乘以精度因子(例如1e8)并舍入为最接近的整数(int)i+0.5 (如果i> 0),然后创建一个集合/映射键取消这些整数,当提取键的最终值时,用精度因子除以整数以得到双值(虽然是四舍五入)。

我建议首先使用整型键(例如long long整数)作为地图,然后使用固定精度进行划分以修剪它们以得到双重表示。

但是,这取决于,如果你能够为你的实际使用情况应用定点数学。 如果您需要涵盖范围广泛的价值精确度(如eg + -1e-7 - + - 1e7),则此方法无效。


将所有双精度(我们打算用作关键点的精度)乘以精度因子(例如1e8)并舍入到最接近的整数(int)i + 0.5(如果i> 0),然后创建一个集合/映射关闭这些整数。 提取键的最终值时,将精度因子除以整数以得到双精度值(尽管舍入)。

除了将精度因子除以返回双精度值外,只需将double和关联值一起存储在结构中,并将该结构放在字典中作为该整数键的“值”。 这样, 原来的 double值仍然可以用于计算。 只是不用于关键搜索。

但是,如果您的生活方式可能稍微有点圆润(因为您只需将一个整数除以一个小数),您的建议方法已经足够好了。

正如另一个答案所说,它非常依赖于值的范围。 如果有些非常庞大而另外一些非常小,那么获得整数键的方法将不起作用。 如果他们只有几位数字,那么它可能。

链接地址: http://www.djcxy.com/p/86253.html

上一篇: Ways around using a double as a key in a std set/map

下一篇: Android Gradle Read App Name from strings.xml