gpt4 book ai didi

c++ - 是否有一个函数可以将每个 double 转换为唯一的 uint64_t,同时保持精度和 ORDER? (为什么我找不到?)

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:50 25 4
gpt4 key购买 nike

我的理解是

  • C++ 中的 double (至少在概念上)编码为 double IEEE 754 编码 float 。
  • IEEE 754 说这样的数字可以用 64 位来表示。

所以我应该期望存在一个函数 f可以将每个 double 映射到唯一的 uint64_t,并且应该保持顺序——即,对于所有 double lhs, rhs , lhs < rhs == f(lhs) < f(rhs) ,除非( lhsrhsNaN )。

我无法在库或 StackOverflow 答案中找到这样的函数,尽管这样的函数可能有助于避免在 double 的排序算法中为 double 实例化额外的模板。作为排序键很少见。

我知道简单地除以 EPSILON 是行不通的,因为精度实际上随着数字变大而降低(并随着数字非常接近于零而提高);不过,我还没有完全弄清楚这种缩放的确切细节。

原则上肯定存在这样的功能。

难道我没找到是因为它不能用标准的C++写吗?那会不会太慢了?它不像我想的那样对人们有用?

最佳答案

如果 IEEE-754 64 位 float 的表示被视为 64 位二进制补码值,则这些值与相应的浮点值具有相同的顺序。唯一涉及的调整是将位模式视为代表浮点值或整数值的心理调整。在 CPU 中这很简单:你有 64 位数据存储在内存中,如果你对这些位应用浮点运算,你就是在做浮点运算,如果你对这些位应用整数运算,你就是在做整数运算操作。

在 C++ 中,数据类型决定了您可以执行的操作类型。要将浮点运算应用于 64 位数据对象,该对象必须是浮点类型。要应用积分运算,它必须是积分类型。

将位模式从 float 转换为整数:

std::int64_t to_int(double d) {
std::int64_t res
std::memcpy(&res, &d, sizeof(std::int64_t));
return res;
}

向另一个方向转换留给读者作为练习。

关于c++ - 是否有一个函数可以将每个 double 转换为唯一的 uint64_t,同时保持精度和 ORDER? (为什么我找不到?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822479/

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