当前位置: 首页 > 知识库问答 >
问题:

排序算法如何对容器和浮动范围进行排序?

霍书
2023-03-14

因为比较浮点数是邪恶的,所以如果我有一个浮点数的容器,并且我使用一些标准库排序算法对它进行排序,比如d::排序,那么算法如何对它们进行排序?

std::vector<float> vf{2.4f, 1.05f, 1.05f, 2.39f};
std::sort( vf.begin(), vf.end() );

>

  • 那么算法是否比较了1.05f1.05f

    它是否在内部使用类似于:std::fabs(1.05f-1.05f)

    这也适用于s的容器吗?谢谢!


  • 共有2个答案

    都阳辉
    2023-03-14
    匿名用户

    因为比较< code>floats是邪恶的…

    这是一个神话,是错误的。与之相关的是浮点数近似实数的神话。

    根据IEEE 754浮点算术标准和其他浮点格式的常见规范,任何浮点表示±F•be都准确地表示一个数字。偶数∞和−∞被认为是精确的。指定用于近似实数算术的是浮点算术中的操作,而不是数字。当执行计算运算时,其结果是根据所选舍入规则四舍五入到最接近的可表示数的实数结果,除了具有域错误的操作可能会产生NaN。(舍入到最接近的平衡点是最常见的规则,还有其他几个规则。)

    因此,当您加减数字、乘以或除以数字、取平方根或将数字从一个基数转换为另一个基数(如十进制字符输入为内部浮点格式)时,可能会出现舍入错误。

    有些操作没有错误。比较操作没有错误。<代码>

    理解这种区别,即数字是精确的,操作可以近似,对于分析、设计和证明涉及浮点算术的算法至关重要。

    当然,在一个数字数组中,这些数字可能包含来自早期运算的错误:它们不同于通过实数算术获得的数字。在这种情况下,数字将根据其实际计算值排序,而不是理想情况下希望它们具有的值。这不是正确排序数字的障碍。

    要对包含NaN的数据进行排序,您需要一个total order谓词来报告一个数据在所需的排序顺序中是否早于另一个数据,例如报告NaN晚于任何非NaN的数据。IEEE-754定义了一个全序谓词,但是我不能说它在C中是否可用(根据我尝试的一个快速测试,似乎没有提供它)。)

    司空坚
    2023-03-14
    匿名用户

    那么算法比较< code>1.05f和< code>1.05f呢?

    它是否在内部使用类似于:std::fabs(1.05f-1.05f)

    不,它使用运算符

    这是否也适用于doubles的容器?

    是的,它适用于任何类型的容器(除非您为std::sort提供自己的比较函数)

     类似资料:
    • 我有一个带有aoColumnDefs的数据表,其中包含: 此列中的日期是格式为“MM/dd/yyyy-MM/dd/yyyy”的字符串。不幸的是,此列当前排序不正确。它不是按年、月、日排序,而是按月、日、年排序。 我假设这是一个日期格式问题(因为它是从左到右排序日期部分,假设我的日期是yyyy/mm/dd)。 在对数据表上的日期进行排序时,有没有办法设置使用的日期格式? 注意:我知道我可以对隐藏字段

    • 问题内容: 我使用以下行以相反的顺序对浮点数组进行排序,但出现错误消息,这是什么问题? 错误:找不到符号 符号:方法sort(float [],java.util.Comparator)位置:类java.util.Arrays Arrays.sort(sortedData,Collections.reverseOrder()); ==================================

    • 我知道这听起来很奇怪,但是,我正在开发一个应用程序,当quicksort完成对数组的排序时,我必须执行一些操作,我需要找到起始索引、结束索引或透视之间的任何关系,或者任何可以告诉我这将是对数组排序所需的最后一个分区/交换... 配分函数: 交换功能:

    • 问题内容: 我在Java中有一个双打列表,我想按降序对ArrayList进行排序。 输入如下: 输出应该是这样的 问题答案: 那会做你想要的。请记住要导入!

    • 是否可以在elasticsearch中更改范围聚合结果的排序?我在elasticsearch中有一个键控范围查询,并希望根据键而不是doc_count进行排序。 我的文件是: 和聚合查询: 此查询的结果是: 我想根据关键字对结果进行排序,而不是根据范围值。根据elasticsearch文档,无法指定排序顺序,当指定排序顺序时,我得到以下异常: 你有什么办法吗?谢谢!