【发布时间】:2021-07-01 21:53:53
【问题描述】:
在 java 中是否有任何标准方法可以将 IBM 370(以字节的形式)转换为 IEEE 格式?任何转换算法都会有所帮助..
我尝试编写 java 代码..但我不明白我哪里出错了。当我将输入作为 -2.000000000000000E+02 时,我得到的值是 IEEE 格式的 -140.0。在其他情况下,当我将输入作为 3.140000000000000E+00 时,我得到的值为 IEEE 格式的 3.1712502374909226 对此的任何帮助将不胜感激
private void conversion() {
byte[] buffer = //bytes to be read(8 bytes);
int sign = (buffer[0] & 0x80);
// Extract exponent.
int exp = ((buffer[0] & 0x7f) - 64) * 4 - 1;
//Normalize the mantissa.
for (int i = 0; i < 4; i++) {//since 4 bits per hex digit
if ((buffer[1] & 0x80) == 0) {
buffer = leftShift(buffer);
exp = exp - 1;
}
}
// Put sign and mantissa back in 8-byte number
buffer = rightShift(buffer);// make room for longer exponent
buffer = rightShift(buffer);
buffer = rightShift(buffer);
exp = exp + 1023;//Excess 1023 format
int temp = exp & 0x0f;//Low 4 bits go into B(1)
buffer[1]= (byte)((buffer[1]&0xf) | (temp *16));
buffer[0]= (byte)(sign | ((exp/16) & 0x7f));
}
private byte[] rightShift(byte[] buf) {
int newCarry = 0;
int oldCarry = 0;
for(int i = 1; i<buf.length; i++) {
newCarry = buf[i] & 1;
buf[i] = (byte)((buf[i] & 0xFE)/2 + (oldCarry != 0 ? 0x80 : 0));
oldCarry = newCarry;
}
return buf;
}
private byte[] leftShift(byte[] buf) {
int newCarry = 0;
int oldCarry = 0;
for(int i = buf.length-1; i>0; i--) {
newCarry = buf[i] & 1;
buf[i] = (byte)((buf[i] & 0x7F)*2 + (oldCarry != 0 ? 1 : 0));
oldCarry = newCarry;
}
return buf;
}
【问题讨论】:
-
您说的是哪种类型的 IBM 号码?有三种二进制浮点表示 (en.wikipedia.org/wiki/IBM_Floating_Point_Architecture) 和多种其他格式。
-
嗨,我说的是双精度 64 位
标签: java floating-point ieee-754