gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:56:44 25 4
gpt4 key购买 nike

在映射/集合中使用 double 作为键的问题是浮点精度。

有些人建议在您的比较函数中添加一个 epsilon,但这意味着您的键将不再满足必要的严格弱排序标准。这意味着您将根据插入元素的顺序获得不同的集合/映射。

如果您想基于 double 值聚合/组合/合并数据,并愿意允许一定程度的舍入/epsilon(显然,您必须这样做),那么以下解决方案是个好主意?

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

最佳答案

"Convert all the doubles (where we intended as keys) into integers by multiplying them by the precision factor (e.g. 1e8) and rounding to the nearest integer (int)i+0.5(if i>0), then create a set/map that keys off these integers. When extracting the final values of the keys, divide the ints by the precision factor to get the double value back (albeit rounded)."

我建议首先对 map 使用整数类型键(例如 long long),然后使用固定的除法精度将它们修剪为 double 表示。

但这取决于您是否能够申请 fix point math对于您的实际用例。如果您需要涵盖范围广泛的值精度(例如 +-1e-7 - +-1e7),这种方法将不起作用。

关于c++ - 在 std set/map 中使用 double 作为键的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com