标准C ++ 11中的IEEE 754总订单

时间:2013-11-20 13:33:03

标签: c++11 ieee-754

根据IEEE floating point wikipage(在IEEE 754上),在双精度浮点上有total order(即在具有IEEE-754浮点数的C++11实现上,如gcc 4.8在Linux / x86-64上。

当然,operator <上的double通常会提供总订单,但已知NaN是例外情况(众所周知,民间传说x != x是一种测试方法{ {1}},声明为x是NaN)。

我问的原因是我想要一个。 double x;(实际上,一组类似JSON的或类似Python的值)我希望该集合具有一些规范表示(我实际关注的是发出可移植的JSON同名数据,按相同的顺序排序) ,无论是在Linux / x86-64上,还是在Linux / ARM上,甚至是像NaN这样的奇怪案例。

我找不到任何简单的方法来获得总订单。我编码了

std::set<double>

实际上,我确实知道这不是一个真正的(数学上讲)总订单 (因为例如逐位不同的NaN都相等),但我希望它具有相同的功能 几种常见架构上的(或非常接近的)行为。

有任何意见或建议吗?

(也许我不应该那么在乎;我故意不关心signaling NaNs

总体动机是我正在编写一些动态类型的解释器,它以JSON表示法保持其整个内存状态,我想确保持久状态在架构之间是稳定的,换句话说,如果我加载JSON状态并转储它,它对于几种体系结构(特别是所有x86-64,ia-32,ARM 32位......)都是幂等的。

1 个答案:

答案 0 :(得分:7)

我会用:

int totalcompare(double x, double y) {
    int64_t rx, ry;

    memcpy(&rx, &x, sizeof rx);
    memcpy(&ry, &y, sizeof ry);

    if (rx == ry) return 0;

    if (rx < 0) rx ^= INT64_MAX;
    if (ry < 0) ry ^= INT64_MAX;

    if (rx < ry) return -1; else return 1;
 }

这会使0.0-0.0比较不相等,而您的版本中的if (x==y) return 0;会使它们相等,这意味着您的版本只是预订。 NaN值高于其余值,不同的NaN比较不同。与<=相当的所有值应与上述关系的顺序相同。

注意:上面的函数是C.我不懂C ++。