簡體   English   中英

是否存在可以將每個double轉換為唯一的uint64_t並保持精度和ORDER的功能? (為什么我找不到一個?)

[英]Is there a function that can convert every double to a unique uint64_t, maintaining precision and ORDER? (Why can't I find one?)

我的理解是

  • C ++中的雙精度(至少在概念上)被編碼為雙精度IEEE 754編碼的浮點數。
  • IEEE 754表示此類數字可以用64位表示。

因此,我應該期望有一個函數f可以將每個雙double lhs, rhs映射到唯一的uint64_t,並且應該保持順序-即對於所有double lhs, rhslhs < rhs == f(lhs) < f(rhs) ,除非( lhsrhsNaN )。

我無法在庫或StackOverflow答案中找到這樣的功能,即使這樣的功能對於避免實例化double中作為double-作為排序鍵很少的sort算法中的double模板可能很有用。

我知道,簡單地除以EPSILON是行不通的,因為隨着數字的增加,精度實際上會降低(隨着數字非常接近於零,精度會提高)。 不過,我還沒有弄清楚縮放的確切細節。

原則上肯定存在這樣的功能。

我是否找不到它,因為它不能用標准C ++編寫? 那會太慢嗎? 那對人們沒有我想的有用嗎?

如果將IEEE-754 64位浮點數的表示形式視為64位二進制補碼值,則這些值與相應的浮點值具有相同的順序。 所涉及的唯一調整是使人看到比特模式代表浮點值或整數值的心理調整。 在簡單的CPU中:您在內存中存儲了64位數據,如果對這些位應用浮點運算,則在進行浮點運算;如果對這些位應用整數運算,則在進行整數操作。

在C ++中,數據類型決定了您可以執行的操作類型。 要將浮點操作應用於64位數據對象,該對象必須是浮點類型。 要應用積分運算,它必須是整數類型。

要將位模式從浮點轉換為整數:

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

留給其他方向的轉換作為練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM