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

zha*_*min 8 c++ floating-point dictionary key set

在地图/集合中使用双精度作为关键字的问题是浮点精度.

有些人建议在比较函数中添加epsilon,但这意味着您的密钥将不再满足必要的严格弱排序标准.这意味着您将获得不同的集/映射,具体取决于插入元素的顺序.

如果您想基于双值聚合/组合/合并数据,并且愿意允许一定程度的舍入/ epsilon(显然,您将不得不),以下解决方案是个好主意吗?

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

πάν*_*ῥεῖ 3

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

我建议long long首先对地图使用整数类型键(例如 ),并使用固定精度进行除法来修剪它们以实现双精度表示。

但这取决于您是否能够将定点数学应用于您的实际用例。如果您需要覆盖广泛的值精度(例如+-1e-7 - +-1e7),这种方法将不起作用。