Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将IEEE Python float转换为Microsoft Basic float

如何将IEEE Python float转换为Microsoft Basic float
EN

Stack Overflow用户
提问于 2010-02-15 18:47:40
回答 4查看 1.3K关注 0票数 3

我得到了Python的浮点值,我需要将它转换成Microsoft Basic float (MBF)格式。幸运的是,从互联网上得到了一些代码,可以做相反的事情。

代码语言:javascript
运行
AI代码解释
复制
def fmsbin2ieee(self,bytes):
    """Convert an array of 4 bytes containing Microsoft Binary floating point
    number to IEEE floating point format (which is used by Python)"""
    as_int = struct.unpack("i", bytes)
    if not as_int:
        return 0.0
    man = long(struct.unpack('H', bytes[2:])[0])
    exp = (man & 0xff00) - 0x0200
    if (exp & 0x8000 != man & 0x8000):
        return 1.0
        #raise ValueError('exponent overflow')
    man = man & 0x7f | (man << 8) & 0x8000
    man |= exp >> 1
    bytes2 = bytes[:2]
    bytes2 += chr(man & 255)
    bytes2 += chr((man >> 8) & 255)
    return struct.unpack("f", bytes2)[0]

现在我需要逆转这个过程,但还没有成功。有什么需要帮忙的吗?

EN

回答 4

Stack Overflow用户

发布于 2010-02-15 19:21:11

如果你打算在Windows下运行时执行这些转换,更快的方法可能是下载并安装mbf2ieee.exe,然后调用结果Mbf2ieee.dll提供的CVS函数(例如通过ctype)。

如果你热衷于使用纯Python语言,我认为(但我不能测试,因为手头没有MBF数字),下面的代码可能会起作用(我刚把它从C code here移植到Python ):

代码语言:javascript
运行
AI代码解释
复制
def mbf2ieee(mbf_4bytestring):
  msbin = struct.unpack('4B', mbf_4bytestring)
  if msbin[3] == 0: return 0.0

  ieee = [0] * 4
  sign = msbin[2] & 0x80
  ieee_exp = msbin[3] - 2
  ieee[3] = sign | (ieee_exp >> 1)
  ieee[2] = (ieee_exp << 7) | (msbin[2] & 0x7f)
  ieee[:2] = msbin[:2]

  return struct.unpack('f', ieee)[0]

如果这有问题,你能给出一些输入值和预期结果的例子吗?

编辑:如果它是你想要的反向函数,它应该是:

代码语言:javascript
运行
AI代码解释
复制
def float2mbf4byte(f):
  ieee = struct.pack('f', f)
  msbin = [0] * 4
  sign = ieee[3] & 0x80

  msbin_exp = (ieee[3] << 1) | (ieee[2] >> 7)
  # how do you want to treat too-large exponents...?
  if msbin_exp == 0xfe: raise OverflowError
  msbin_exp += 2

  msbin[3] = msbin_exp
  msbin[2] = sign | (ieee[2] & 0x7f)
  msbin[:2] = ieee[:2]
  return msbin
票数 4
EN

Stack Overflow用户

发布于 2010-08-09 15:12:59

嗯,我尝试了float2mbf4byte(),做了两个修改:

  1. 转换负值现已生效,
  2. for Python 2,ieee应为整型列表,而不是字符串

代码片段:

代码语言:javascript
运行
AI代码解释
复制
def float2mbf4byte(f):
    ieee = [ord(s) for s in struct.pack('f', f)]
    msbin = [0] * 4

    sign = ieee[3] & 0x80
    ieee[3] &= 0x7f

    msbin_exp = (ieee[3] << 1) | (ieee[2] >> 7)
    # how do you want to treat too-large exponents...?
    if msbin_exp == 0xfe: raise OverflowError
    msbin_exp += 2

    msbin[3] = msbin_exp
    msbin[2] = sign | (ieee[2] & 0x7f)
    msbin[:2] = ieee[:2]
    return msbin

def ieee2fmsbin(f):
    return struct.pack('4B', *float2mbf4byte(f))
票数 0
EN

Stack Overflow用户

发布于 2020-12-11 01:17:33

mbf2ieee无法正确转换,请尝试以下命令:

代码语言:javascript
运行
AI代码解释
复制
import struct

def float2mbf4byte(f):
    ieee = struct.pack('f', f)
    msbin = [0] * 4
    sign = ieee[3] & 0x80

    msbin_exp = (ieee[3] << 1) | (ieee[2] >> 7)
    # how do you want to treat too-large exponents...?
    if msbin_exp == 0xfe: raise OverflowError
    msbin_exp += 2

    msbin[3] = msbin_exp
    msbin[2] = sign | (ieee[2] & 0x7f)
    msbin[:2] = ieee[:2]
    return msbin

def mbf2ieee(mbf_4bytestring):
    msbin = struct.unpack('4B', mbf_4bytestring)
    if msbin[3] == 0: return 0.0

    ieee = [0] * 4
    sign = msbin[2] & 0x80
    ieee_exp = msbin[3] - 2
    ieee[3] = sign | (ieee_exp >> 1)
    ieee[2] = (ieee_exp << 7) | (msbin[2] & 0x7f)
    ieee[:2] = msbin[:2]

    return struct.unpack('f', bytearray(ieee))[0]


print(mbf2ieee(bytearray(float2mbf4byte(52400126))))

..。你将会得到:

builtins.ValueError:字节必须在(0,256)范围内,因为正确答案是[0,E4,47,9A],但float2mbf4byte提供[0, 228, 19527, 76]。第3个元素不是字节大小值

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

https://stackoverflow.com/questions/2268191

复制
相关文章
numpy float转int_python字符串转float类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
1.7K0
dot net double 数组转 float 数组
本文告诉大家如果遇到 double 数组转 float 数组千万不要使用 Cast ,一般都使用 select 强转。
林德熙
2022/08/04
1.1K0
Float Panel
基础引入方案(通用) 新建 [Blogroot]\themes\butterfly\source\js\floatpanel.js, var ANGLE = 45; //控制浮动角度,数值越大,浮动幅度越大。 var panel= document.getElementsByClassName('wowpanels'); for(var i = 0;i<panel.length;i++){ floatable(panel[i]);   } function floatable (content) {
Akilar
2021/06/11
7170
dot net double 数组转 float 数组
本文告诉大家如果遇到 double 数组转 float 数组千万不要使用 Cast ,一般都使用 select 强转。
林德熙
2018/09/18
1.4K0
浮动(float)
html语言当中另外一个相当重要的概念----------标准流!或者普通流。普通流实际上就是一个网页内标签元素正常从上到下,从左到右排列顺序的意思,比如块级元素会独占一行,行内元素会按顺序依次前后排列;按照这种大前提的布局排列之下绝对不会出现例外的情况叫做普通流布局。
星辰_大海
2020/09/30
2.5K0
Float浮动
CSS中float属性会使元素浮动,使元素向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。
WindRunnerMax
2020/08/27
1.2K0
float double取值范围_double float区别
要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法,比如,简单点的,float四个字节,前两个字节表示整数位,后两个字节表示小数位(这就是一种规则标准),这样就组成一个浮点数。而Java中浮点数采用的是IEEE 754标准。
全栈程序员站长
2022/11/03
2K0
JAVA float转int 如何取整_int型变量n转化成float
网上巴巴的说了那么多,倒是给个结论啊.搜索半天,浪费一堆时间,不知道到底哪个说的对哪个说的错. 直接自己写着看吧.
全栈程序员站长
2022/11/17
1.4K0
JAVA float转int 如何取整_int型变量n转化成float
css中float
注意点: 1.浮动流中没有居中对齐, 也就是没有center这个取值 2.在浮动流中是不可以使用margin: 0 auto;
贵哥的编程之路
2020/10/28
9970
tf.to_float
tf.to_float(     x,     name='ToFloat' ) 将张量强制转换为float32类型。  参数: x:  张量或稀疏张量。 name:  操作的名称(可选)。 返回值: 一种形状与x相同的张量或稀疏张量,类型为float32。 异常: TypeError: If x cannot be cast to the float32. 原链接:  https://tensorflow.google.cn/versions/r1.9/api_docs/python/tf/to_flo
狼啸风云
2022/10/28
7240
【前端】CSS : float
注:当一个元素浮动之后,从普通文档流中脱离,然后向左或者向右平移,一直平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。
Gavin-ZYX
2019/03/04
2K0
【前端】CSS : float
JDK源码分析 Float
对于JDK源码分析的文章,仅仅记录我认为重要的地方。源码的细节实在太多,不可能面面俱到地写清每个逻辑。所以我的JDK源码分析,着重在JDK的体系架构层面,具体源码可以参考:http://www.cnblogs.com/skywang12345/category/455711.html。
Yano_nankai
2018/10/08
8460
JDK源码分析 Float
走进 JDK 之 Float
如果你对这个答案抱有疑问,那么在阅读 Float 源码之前,我们先来看一下 Float 在内存中是如何表示的。
路遥TM
2021/08/31
9570
CSS理解之Float
1.Float的设计初衷仅仅是: 实现文字环绕效果,如下图所示: Paste_Image.png 明白了float的设计初衷,就可以明白float特有的行为表现了。 我们都知道,使用float会产生一
小胖
2018/06/27
7320
javascript当中float:left,clear:left,float:right和clear:right用法
2.float:left,clear:left,float:right和clear:right用法 例 1.2 <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <style type="text/css"> #first{ background-color:#EE1583; width:15%; float:left; } #second{ background-color:#90aaaa; width:15%; /*clear:right;*/ float:left; } #third{ background-color:#eeee00; width:15%; clear:left;/*马克-to-win:clear:left;效果就会换行了,文档:在左侧不允许浮动元素。*/ float:left; /*clear:right;*/ } #fourth{ background-color:#FF0000; width:20%; clear:left; /*clear:left;就会换行了*/ float:right; } #fifth{ background-color:#6A5ACD; width:20%; clear:right;/*上一个是clear:right,所以用clear:right;就会换行了*/ float:right; } </style> </head> <body> <span id="first" >11</span> <span id="second">22</span> <span id="third">33</span> <span id="fourth">44</span> <span id="fifth">55</span> </body> </html>
马克java社区
2019/11/26
1.2K0
javascript当中float:left,clear:left,float:right和clear:right用法
Python中float类型、float32类型和float64类型的表示精度,所需内存及其之间的转换
float类型和float64类型是一样的,都需要64个bits,而float32需要32个bits。 精度方面,float类型和float64类型在十进制中可以有16位,而float32类型在十进制中有8位,如下:
用户7886150
2021/01/23
13.6K0
The Mystery Of The CSS Float Property
数年前,当开发者首次开始不使用table 来布局网页时,CSS中的一个property突然间显得格外重要,该属性就是float。float属性变得如此常用的原因在于:默认情况下,在一个以列布局的方式中 block-level元素之间不会对齐。因为column在实际的CSS布局中 是常用且必需的,所以float属性逐渐地被极多地采用(甚至滥用)。
lesM10
2019/08/26
1.8K0
The Mystery Of The CSS Float Property
float的内存存储
十进制->二进制 eg:十进制数10转换二进制 10/2=5········0 5/2 = 2······1 2/2 = 1·····0 1/2 = 0······1 所以10的二进制为1010 float->二进制 8.25 整数部分与上面一样 8/2=4···0 4/2 = 2···0 2/2 = 1···0 1/2 = 0···1 8->1000(b) 0.25->二进制 0.25*2 = 0.5 <1 0 0.5*2 = 1.0 = 1 1 所以8.25 = 1000.01 = 1.00001*2^3
用户7272142
2023/04/12
7300
Float 的那些事
  display:inline-block某种意义上的作用就是包裹(wrap),而浮动也有类似的效果。举个常见例子,或许您有实现宽度自适应按钮的经验,实现宽度自适应的关键就是要让按钮的大小自适应于文字的个数,这就需要按钮要自动包裹在文字的外面。我们用什么方法实现呢?一就是display:inline-block;二就是float。
超然
2018/08/03
1K0
Float 的那些事
点击加载更多

相似问题

将Float转换为IEEE754

112

如何将消息类型Float64转换为Float32

128

如何将数组float*转换为float**?

13

如何将std::queue<float>转换为float[]?

29

IEEE float十六进制424ce027到float?

62
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档