common-lisp - sbcl:将(无符号字节 32)转换为单 float

标签 common-lisp sbcl

我有一个数组 (unsigned-byte 32)它包含相当多的数据,其中一些是浮点格式。也就是说,一些字节被处理为包含位字段的整数,而其中一些被处理为 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 的按位内容的任何想法作为浮点数的按位内容?

最佳答案

您可能会(declare (optimize (safety 0)) (type (signed-byte 32) x))) .这似乎产生了更短的程序集(它甚至优化了未使用的 if 分支)和相同的结果。不过,我建议真正仔细检查程序集,并通过彻底的回归测试来确保这一点。

关于common-lisp - sbcl:将(无符号字节 32)转换为单 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20675867/

相关文章:

common-lisp - 简单算术函数中无法访问的代码

emacs - 如何让 SLIME 从加载的其他包中自动完成符号?

list - 如果原子在列表中则返回 True 的 LISP 函数

lisp - 值 0 不是 STRING 类型 lisp 错误

utf-8 - 如何让 quicklisp 在 Slime 中加载 rfc2388?

lisp - SBCL Buildapp——如何进行调试/故障排除?

lisp - 如何从 CL REPL 获取函数/宏定义?

lisp - 如何使用任意数量的参数在 lisp 中定义结构?

common-lisp - SBCL 特定声明

Lisp 在一行上漂亮地打印对象