2013-12-19 194 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

相关问题