漂浮到Real48

时间:2015-11-06 20:15:03

标签: python pascal

我试图在python中将浮点数转换为Real48(Borland Pascal)。我发现这个method写的是C#(我认为)

static byte[] DoubleToReal48(double d)
{
  byte[] r = new byte[6];

  long bits = BitConverter.DoubleToInt64Bits(d);
  bool negative = ((bits >> 63) & 1) != 0;
  long exponent = ((bits >> 52) & 0x7FF) - 1023;
  long mantissa = bits & 0xFFFFFFFFFFFFFL;

  long raw = (negative ? 1 : 0);
  raw = (raw << 39) | (mantissa >> 13);
  raw = (raw << 8) | ((exponent + 129) & 0xFF);

  for (int k = 0; k < 6; k++)
  {
    r[k] = (byte)(raw & 0xFF);
    raw >>= 8;
  }
  return r;
}

我不知道C#,所以我很难将它翻译成python。谁能帮我?或许还有更好的方法?

我找到this但它似乎只将Real48转换为双倍,而不是我需要的其他方式。

1 个答案:

答案 0 :(得分:3)

让我尝试将C#翻译成python

1.-将位从双数转换为数字(无符号长long)。

long bits = BitConverter.DoubleToInt64Bits(d);

转换为

struct.unpack("Q", struct.pack("d", python_double) )[0]

它使用标准库中的struct模块。

2.-从双重表示中提取每个字段

bool negative = ((bits >> 63) & 1) != 0;
long exponent = ((bits >> 52) & 0x7FF) - 1023;
long mantissa = bits & 0xFFFFFFFFFFFFFL;

这可以逐字翻译alsmot,因为python中存在相同的运算符。

negative = ((bits >> 63) & 1)    # Integer 1 for negative, 0 for positive
exponent = ((bits >> 52) & 0x7FF) - 1023
mantissa = bits & 0xFFFFFFFFFFFFF

3.-再将数字装入48位

long raw = (negative ? 1 : 0);
raw = (raw << 39) | (mantissa >> 13);
raw = (raw << 8) | ((exponent + 129) & 0xFF);

与数字2相同,

raw = negative
raw = (raw << 39) | (mantissa >> 13)
raw = (raw << 8) | ((exponent + 129) & 0xFF)

4.-将数字转换为6字节的字符串

for (int k = 0; k < 6; k++)
{
  r[k] = (byte)(raw & 0xFF);
  raw >>= 8;
}    

在第1步中使用struck,

data = struck.pack('Q', raw)
data = data[:6]  # Drop the 16 MSB

注意:我删除了最后2个字符,因为struct使用处理器&#39;默认情况下是字节顺序(在我的例子中是x86),但可以用第一个参数控制。

提示:如果要将数字转换为二进制表示,可以使用'{:064b}'.format(number)。这将用零填充它以填充64个字符。