我有一个(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
的按位内容作为要浮动的按位内容的任何想法?
确实,这确实会产生正确的汇编代码。当然,在这种情况下,整个“if”是不必要的。但是,再次,这是一个有点骇人听闻的解决方案,虽然它与当前版本一起工作,但我认为通常认为它将来也可以工作通常是安全的。但是,暂时足够了 - 谢谢! – jlahd