将IBM十六进制浮点数据转换为IEEE754浮点数据。
ibm2ieee的Python项目详细描述
ibm2ieee包为 转换IBM单精度和双精度十六进制浮点 到几乎所有的python和numpy使用的ieee 754格式浮动 当前平台。
功能
- 快速:在典型的现代计算机上每秒转换2-4亿个值 机器,假设输入正常。
- 正确:根据默认值,转换后的结果被正确舍入 ieee 754圆形连接到偶数圆形模式。转角箱(溢流、底流, 次正规结果、有符号零、非正规输入)都被处理 正确地。四舍五入的转换值超出目标的范围 类型,则返回一个适当的有符号无穷大。
- 处理单精度和双精度输入和输出格式。
可移植性注意:此模块中提供的转换函数假定 numpy.float32和numpy.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条款许可证授权的。见 有关详细信息的许可证文件。