大型机 S370 十六进制浮点数到十进制的转换

Posted

技术标签:

【中文标题】大型机 S370 十六进制浮点数到十进制的转换【英文标题】:Conversion of mainframe S370 hexadecimal floating–point to decimal 【发布时间】:2016-02-26 05:51:21 【问题描述】:

我正在从大型机读取二进制文件,我想将当前以 HEX 表示的单进动浮点数转换为 Python 中的十进制等效值。例如

X'42808000' ==> 应该转换成十进制的 128.50.. X'C2808000' ==> 应该转换成十进制的-128.50

它们是python 中的任何内置函数吗?看起来内部浮动表示不是 IEEE 格式,而是旧的“S370 大型机十六进制格式”。请让我知道您对如何转换相同的想法。谢谢

【问题讨论】:

您需要找到或弄清楚 :"old S370" 二进制格式(我怀疑它是十六进制字符),然后您可以确定将其转换为 Python 浮点数所需的操作。我确定它记录在某处。 我得到了一份文档,其中显示了转换是如何完成的……但我不确定如何将其放入一段代码中。任何帮助,将不胜感激。谢谢edwardbosworth.com/My3121Textbook_HTM/MyText3121_Ch17_V02.htm(示例1和2) 好的,但是直到今天早上晚些时候我才能查看它(现在几乎是凌晨 2:00)。我在链接文档中注意到我不明白的一件事。它说“回顾以 7 位无符号格式存储的整数的范围是 0 £ N £ 127,我们有 0 £ (E + 64) £ 127,或 –64 £ E £ 63。” £ 字符是什么意思, 是的,它小于等于 ( 感谢您抽出时间马蒂诺 【参考方案1】:

从您的问题中不清楚您说数字当前在哪里以 HEX 表示,对于 S370 十六进制浮点数的格式,无论您认为它们是二进制整数还是字符串值,所以我写了一个函数将接受任何一个。

try:
    basestring
except NameError:  # Python 3
    basestring = str

def hextofp(hexadecimal):
    """ Convert S370 hexadecimal floating-point number to Python
        binary floating point value (IEEE 754).
    """
    v = int(hexadecimal, 16) if isinstance(hexadecimal, basestring) else hexadecimal
    if v:  # not special case of "True 0"
        sign = -1 if v & 0x80000000 else 1
        exponent = ((v & 0x7f000000) >> 24) - 64  # remove bias
        fraction = float(v & 0x00ffffff) / 16777216  # divide by 2**24
        return sign * (fraction * 16**exponent)
    return 0.0

print(':.2f'.format(hextofp('42808000')))  # -> 128.50
print(':.2f'.format(hextofp(0x42808000)))  # -> 128.50
print(':.2f'.format(hextofp('C2808000')))  # -> -128.50
print(':.3f'.format(hextofp('40600000')))  # -> 0.375

# True 0
print(':.1f'.format(hextofp('00000000')))  # -> 0.0
# largest representable number
print(':.8g'.format(hextofp('7fffffff')))  # -> 7.2370051e+75
# smallest positive (normalized) number
print(':.8g'.format(hextofp('00100000')))  # -> 5.3976053e-79

# misc examples
print(':.2f'.format(hextofp('42500000')))  # -> 80.00
print(':.2f'.format(hextofp('41100000')))  # -> 1.00
print(':.3f'.format(hextofp('C276A000')))  # -> -118.625
print(':.2f'.format(hextofp('427b3333')))  # -> 123.20
print(':.2f'.format(hextofp('427b7333')))  # -> 123.45

【讨论】:

太棒了...它工作得非常好...非常感谢您的帮助...我会检查您的代码,看看它是如何完成的...

以上是关于大型机 S370 十六进制浮点数到十进制的转换的主要内容,如果未能解决你的问题,请参考以下文章

Python如何将浮点数作为十六进制转换为十进制

将十六进制转换为浮点数

急求十六进制转浮点数C程序!!!

急求十六进制转浮点数C程序!!!

浮点数的十六进制表示

在 SciLab 中将十六进制转换为浮点数