[英]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.