首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将双浮点数转换为字节数组,反之亦然?

如何将双浮点数转换为字节数组,反之亦然?
EN

Stack Overflow用户
提问于 2015-09-17 04:07:41
回答 1查看 802关注 0票数 4

对于整数(32位或4字节),我可以这样做:

代码语言:javascript
复制
(defun get-u4 (arr pos)
  (let ((u4 0))
    (setf (ldb (byte 8 0) u4) (aref arr pos))
    (setf (ldb (byte 8 8) u4) (aref arr (+ pos 1)))
    (setf (ldb (byte 8 16) u4) (aref arr (+ pos 2)))
    (setf (ldb (byte 8 24) u4) (aref arr (+ pos 3)))
  u4))

(defun put-u4 (arr pos int)
  (setf (aref arr pos) (ldb (byte 8 0) int))
  (setf (aref arr (+ pos 1)) (ldb (byte 8 8) int))
  (setf (aref arr (+ pos 2)) (ldb (byte 8 16) int))
  (setf (aref arr (+ pos 3)) (ldb (byte 8 24) int)))

但是,我不知道如何对64位或8字节双浮点数执行此操作?小恩典是假设的。

=============

我找到了一个解决方案(使用外部库);https://www.quicklisp.org/beta/UNOFFICIAL/docs/ieee-floats/doc/index.html使用这个解决方案,我可以用适当的大小对整数进行双浮动编码/解码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-18 13:20:01

从维基百科我们得到了

您可以使用quicklisp获得注释中提到的库:

代码语言:javascript
复制
CL-USER> (ql:quickload 'ieee-floats)
To load "ieee-floats":
  Install 1 Quicklisp release:
    ieee-floats
; Fetching #<URL "http://beta.quicklisp.org/archive/ieee-floats/2015-06-08/ieee-floats-20150608-git.tgz">
; 4.92KB
==================================================
5,041 bytes in 0.01 seconds (378.68KB/sec)
; Loading "ieee-floats"
[package ieee-floats]
(IEEE-FLOATS)
CL-USER> (ieee-floats:encode-float32 23d2)
1158660096
CL-USER> (ieee-floats:decode-float32 #b010101)
2.9427268e-44
CL-USER> (ieee-floats:encode-float32 0)
; Evaluation aborted on #<TYPE-ERROR expected-type: FLOAT datum: 0>.
CL-USER> (ieee-floats:encode-float32 0.0)
0
CL-USER> (ieee-floats:encode-float32 0.1)
1036831949

当然,您可以使用iee-floats:编码/解码-浮动64当然,

您还需要知道#b 010101是一个宏,它用普通的lisp表示在普通数学中可以使用的二进制数:

代码语言:javascript
复制
CL-USER> (+ 2 #b10)
4

因此,它为您将二进制转换为整数,然后您也可以使用格式的实用程序。

代码语言:javascript
复制
(format nil "~B" 2)
"10"

,您可以使用它将整数转换为二进制字符串,最后,您可以注意的唯一一件事是二进制数字之前的0自动完成,ieee库将它们移除用于表示形式。

代码语言:javascript
复制
CL-USER> (ieee-floats:encode-float64 1.0d0)
4607182418800017408
CL-USER> (format nil "~B" *)
"11111111110000000000000000000000000000000000000000000000000000"
CL-USER> (length *)
62
CL-USER> (ieee-floats:encode-float64 -1.0d0)
13830554455654793216
CL-USER> (format nil "~B" *)
"1011111111110000000000000000000000000000000000000000000000000000"
CL-USER> (length *)
64

CL-USER> (ieee-floats:decode-float64 #b11111111110000000000000000000000000000000000000000000000000000 )
1.0d0
CL-USER> (ieee-floats:decode-float64 #b1011111111110000000000000000000000000000000000000000000000000000 )
-1.0d0
CL-USER> (ieee-floats:decode-float64 #b0011111111110000000000000000000000000000000000000000000000000000 )
1.0d0

有了这个,你就可以进行所有需要的转换,祝你好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32622427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档