【问题标题】:std::unordered_set::load_factor, why float instead of double?std::unordered_set::load_factor,为什么浮点数而不是双精度数?
【发布时间】:2019-08-11 13:21:52
【问题描述】:

我了解floatdouble 之间最快的类型取决于原生 ALU 实现,它通常基于双精度。当你进行逆向精度计算时,ALU必须一直做相应的精度转换。

那么,为什么标准选择float 来代表load_factor?我想这是为了节省对哈希表容器的内存思考,但我想知道是否有更强有力的理由。

【问题讨论】:

    标签: c++ unordered-map unordered-set


    【解决方案1】:

    这发生在revision 3 of the original proposal:

    将负载因子操作更改为使用 float 而不是 double

    稍后给出基本原理(在“E. 哈希调整大小的控制”下):

    浮点参数应该是float 类型还是double 类型?它几乎没有什么区别。一方面,double 通常是“自然”浮点类型,在没有强烈相反理由的情况下使用。另一方面,float 可能允许哈希表实现节省一些空间,并且可能会提醒用户该值不会在任何涉及高精度的上下文中使用。我选择了float

    基本上就是你说的。

    至于性能,这里提到了这一点,以及它在总体方案中的重要性(尽管在捍卫使用浮点 整数的上下文中):

    运行时浮点参数的成本是每次重新散列时的一次浮点乘法(不是每次插入)。即使使用增量哈希,这几乎肯定会与重新哈希的成本相比相形见绌。

    【讨论】:

    • “可能会提醒用户该值不会用于任何涉及高精度的上下文”。随着时间的推移,我了解到编程语言的演变以及一般的编程都是关于增加程序员的直觉的。这句话就是一个很好的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2010-09-07
    • 2020-10-13
    • 2016-02-18
    • 2017-04-22
    相关资源
    最近更新 更多