2013-12-19 191 views
6

我有一個(unsigned-byte 32)數組,其中包含相當多的數據,其中一些是浮點格式。也就是說,一些字節是作爲包含位字段的整數來處理的,而其中一些字節是32位浮點數。sbcl:將(無符號字節32)轉換爲單浮點數

我需要讀取和寫入數組中的數據。

不幸的是,該功能sb-kernel:make-single-float需要在(signed-byte 32)參數,並sb-kernel:single-float-bits返回一個符號字一樣,所以他們不是我的矢量直接兼容。另一方面,將矢量轉換爲包含帶符號字節會使位域操作變得痛苦。

這一步,我已經寫了

(defun u32-to-sf (x) 
    (declare (optimize (speed 3) (compilation-speed 0) (debug 0)) 
      (type (unsigned-byte 32) x)) 
    (if (>= x #x80000000) 
     (sb-kernel:make-single-float (- x #x100000000)) 
     (sb-kernel:make-single-float x))) 

它執行正確的事情,但生成的程序集看起來醜陋的條件跳轉和不必要的比較和減法。

有關如何說服sbcl只接受unsigned-byte的按位內容作爲要浮動的按位內容的任何想法?

回答

3

你可能會(declare (optimize (safety 0)) (type (signed-byte 32) x)))。這似乎產生更短的組裝(它甚至優化了未使用的if分支)和相同的結果。儘管如此,我會建議真正仔細檢查程序集,並通過徹底的迴歸測試來保證這一點。

+0

確實,這確實會產生正確的彙編代碼。當然,在這種情況下,整個「if」是不必要的。但是,再次,這是一個有點駭人聽聞的解決方案,雖然它與當前版本一起工作,但我認爲通常認爲它將來也可以工作通常是安全的。但是,暫時足夠了 - 謝謝! – jlahd

相關問題