簡體   English   中英

在C89中,如何截斷並將雙精度浮點數拆分為兩個32位字?

[英]In C89, how can I truncate and split a double precision floating point into two 32-bit words?

以C99為目標時,我可以使用以下代碼截斷並將double值拆分為兩個32位整數:

#include <stdint.h>

void split(double d, unsigned long *most_significant_word, unsigned long *least_significant_word)
{
   uint64_t i = (uint64_t)d;
   *most_significant_word = i >> 32;
   *least_significant_word = i & 0xffffffff;
}

但是C89似乎沒有定義64位整數類型,因此我不能使用編譯器執行截斷。 即使不需要截斷(該值已經表示一個整數),我也無法使用&>>類的位運算符&因為這些運算符不適用於double值。

那么,如何在純C89中實現上面的split()函數(從而不依賴於64位整數),返回組成存儲在double值中的53位整數的21/32位字?

忽略符號(與原始代碼一樣)應該像下面這樣簡單:

void split(double d, unsigned long *most_significant_word, unsigned long *least_significant_word)
{
   *most_significant_word = d/4294967296.; // d>>32 in double
   *least_significant_word = fmod(d, 4294967296.);
}

要考慮負數,請對絕對值進行運算,然后計算兩者的補數:

void split(double d, unsigned long *most_significant_word, unsigned long *least_significant_word)
{
   double dabs = d < 0 ? -d : d;
   *most_significant_word = dabs/4294967296.;
   *least_significant_word = fmod(dabs, 4294967296.);
   if (d < 0) {
       *most_significant_word = ~*most_significant_word;
       *least_significant_word = ~*least_significant_word + 1;
       if (!*least_significant_word) *most_significant_word += 1;
   }
}

暫無
暫無

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

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