将IBM十六进制浮点数据转换为IEEE754浮点数据。

ibm2ieee的Python项目详细描述


ibm2ieee包为 转换IBM单精度和双精度十六进制浮点 到几乎所有的python和numpy使用的ieee 754格式浮动 当前平台。

功能

  • 快速:在典型的现代计算机上每秒转换2-4亿个值 机器,假设输入正常。
  • 正确:根据默认值,转换后的结果被正确舍入 ieee 754圆形连接到偶数圆形模式。转角箱(溢流、底流, 次正规结果、有符号零、非正规输入)都被处理 正确地。四舍五入的转换值超出目标的范围 类型,则返回一个适当的有符号无穷大。
  • 处理单精度和双精度输入和输出格式。

可移植性注意:此模块中提供的转换函数假定 numpy.float32numpy.float64基于标准ieee 754 二进制32和二进制64浮点格式。这是真的 当前大多数平台,但相关语言无法保证 标准。

用法

该软件包提供两个功能:

  • ibm2float32将IBM单精度或双精度数据转换为 ieee 754单精度值,格式为numpy.float32
  • ibm2float64将IBM单精度或双精度数据转换为 ieee 754双精度值,格式为numpy.float64

对于这两个函数,必须表示IBM单精度输入数据 使用numpy.uint32dtype,而ibm双精度输入必须 使用numpy.uint64表示。

两个函数都假设ibm数据已转换为numpy integer 以这样的方式格式化:浮点的最有效位 数字成为整数值中最有意义的位。所以解码时 表示IBM十六进制浮点数的字节数据,这一点很重要 将字节数据的结束性考虑在内。参见示例部分 下面是转换大端字节数据的示例。

示例

>>> import numpy
>>> from ibm2ieee import ibm2float32, ibm2float64
>>> ibm2float32(numpy.uint32(0xc1180000))
-1.5
>>> type(ibm2float32(numpy.uint32(0xc1180000)))
<class 'numpy.float32'>
>>> ibm2float32(numpy.uint64(0x413243f6a8885a31))
3.1415927
>>> ibm2float32(numpy.uint32(0x61100000))
inf
>>> ibm2float64(numpy.uint32(0xc1180000))
-1.5
>>> ibm2float64(numpy.uint64(0x413243f6a8885a31))
3.141592653589793
>>> ibm2float64(numpy.uint32(0x61100000))
3.402823669209385e+38
>>> input_array = numpy.arange(
        0x40fffffe, 0x41000002, dtype=numpy.uint32).reshape(2, 2)
>>> input_array
array([[1090519038, 1090519039],
       [1090519040, 1090519041]], dtype=uint32)
>>> ibm2float64(input_array)
array([[9.99999881e-01, 9.99999940e-01],
       [0.00000000e+00, 9.53674316e-07]])

当转换从文件中读取的字节数据时,了解 数据的终结性(在历史数据中经常是大终结 使用IBM十六进制浮点的文件)。下面是一个转换ibm的示例 以大端形式存储到numpy.float32的单精度数据。注意 在将bytestring转换为numpy时使用'>u4'dtype$ 阵列。对于小尾数输入数据,您可以使用'<u4'

>>> input_data = b'\xc12C\xf7\xc1\x19!\xfb\x00\x00\x00\x00A\x19!\xfbA2C\xf7'
>>> input_as_uint32 = numpy.frombuffer(input_data, dtype='>u4')
>>> input_as_uint32
array([3241296887, 3239649787,          0, 1092166139, 1093813239],
      dtype=uint32)
>>> ibm2float32(input_as_uint32)
array([-3.141593, -1.570796,  0.      ,  1.570796,  3.141593],
      dtype=float32)

格式说明

IBM单精度格式的精度为6个十六进制数字, 实际上,根据二进制代码的不同,转换为21-24位的精度 相关值所属的。IEEE754单精度 24位。所以所有不太小,不太大的IBM单精度值都可以 转换为IEEE754单精度值,不损失精度。 但是,ibm的单精度范围大于相应的ieee 754范围,所以极端的IBM单精度值可能会溢出到无穷大, 下溢为零,或在转换为ieee时四舍五入为低于正常值 754单精度。

对于双精度转换,折衷的方式是相反的:ibm 双精度格式的有效精度为53-56位,而ieee 754双精度有53位精度。所以大部分ibm值都是四舍五入的 转换为IEEE754时。然而,ieee 754的双精度范围是 比IBM的双精度更大,所以不存在溢出的危险, 转换IBM时的下溢或精度降低的异常结果 双精度符合IEEE754双精度。

每个IBM单精度值都可以在IEEE754中精确表示 双精度,所以如果您想要IBM的无损表示 辛格e-精度数据,使用ibm2float64

注意,ibm格式不允许特殊值的表示,如 无限和南。但是,有符号的零是可表示的,并且 所有转换都保留零。

安装

ibm2ieee的最新版本可从python包索引获得,网址为 https://pypi.org/project/ibm2ieee。它可以与pip一起安装在 常规方式:

pip install ibm2ieee

注意,它包含一个c扩展,所以您的系统上需要一个编译器 才能安装。

许可证

ibm2ieee软件包版权所有(c)2018,enthugh,inc.

ibm2ieee包是根据标准bsd 3条款许可证授权的。见 有关详细信息的许可证文件。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript问题:通过URL用网站数据填充Textview   java TabLayout Android,如何用几个标签填充整个屏幕宽度,并用大量标签滚动?   Eclipse Java运行的文件不再存在于我的工作区中   安装两个Java版本时,使用Java的windows链接不起作用   java将多个图形添加到单个JPanel   java Kafka ConsumerFactory,带有两个Desiarizer   使用反射更改java类超类   当一致性测试失败时,java有没有办法让堆栈跟踪显示在控制台中   java映射到基元类型的HashMap的快速替代方案是什么?   java关闭一个jframe所有剩余的打开jframe都将关闭。   java为什么不推荐“使用getString()获取设备标识符”?   java值比较和值赋值之间有什么性能差异吗?   Java实体数组到JavaScript数组   java使用流将一个列表转换为另一个列表   在JTree中保存对象,但更改显示的名称(java swing)?   java“Hello world”Android应用程序,文件尽可能少,没有IDE,只有文本编辑器   java在方法之间传递值   java如何为项目数组创建ParseQuery?