簡體   English   中英

雙精度浮點比較

[英]Double precision floating-point comparison

我在這里有點困惑-當雙精度數存儲為不透明(二進制)字段時,雙精度比較仍然可以正常工作嗎? 我面臨的問題是雙精度數包含符號的前導位(即正數或負數),當它們存儲為二進制數據時,我不確定是否可以正確比較它們:

在此處輸入圖片說明

我想確保比較能夠正確進行,因為我在LevelDB中將double用作鍵元組(例如)的一部分,並且希望保留正負數的數據局部性。 LevelDB僅使用不透明字段作為鍵,但它允許用戶指定自己的比較器。 但是,我只想確保不要指定比較器,除非我絕對需要:

// Three-way comparison function:
//   if a < b: negative result
//   if a > b: positive result
//   else: zero result
inline int Compare(const unsigned char* a, const unsigned char* b) const 
{
    if (*(double*)a < *(double*)b) return -1;
    if (*(double*)a > *(double*)b) return +1;
    return 0;
}

使我的評論成為答案。

有兩件事可能出錯:

  1. 如果一個(或兩個)參數均為NAN ,則比較將始終返回false。 因此,即使二進制表示形式相同, NAN == NAN始終為false。 此外,它違反了比較傳遞性。

  2. 如果任何一個參數未正確對齊(由於它們是char指針),則在不支持未對齊內存訪問的計算機上可能會遇到問題。 對於那些這樣做的人,您可能會遇到性能下降的情況。

因此,要解決此問題,您將需要添加一個陷阱案例,如果其中一個參數原來是NAN ,則將調用該案例。 (我不確定INF的狀態。)

由於需要這種陷阱情況,因此您需要定義自己的比較運算符。

是的,您必須指定自己的比較功能。 這是因為雙精度不一定存儲為“ big-endian”值。 即使從邏輯上講,當以big-endian格式寫出值時,指數也不會出現在尾數之前的內存中。

當然,如果要在同一個數據庫中的不同CPU架構之間共享內容,則可能會因為存儲內容為二進制Blob而最終遇到奇怪的字節序問題。

最后,即使您可以控制字節序,我仍然不會信任它。 例如,如果未對double進行歸一化,則在將其作為二進制數據進行比較時,可能無法正確地將其與另一個double進行比較。

當然,在編寫比較函數時,其他人所說的關於對齊和奇數(例如NAN和INF)的所有內容都非常重要。 但是,就您是否應該編寫一個而言,我不得不說這將是一個非常好的主意。

我假設您的數字格式符合IEEE 754標准。 如果真是這樣,那么簡單的帶符號整數比較將不起作用-如果兩個數字均為負數,則比較的結果將相反。 因此,您必須提供自己的比較器。

暫無
暫無

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

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