Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IBM到IEEE浮点转换_Java_Floating Point_Ieee 754 - Fatal编程技术网

Java IBM到IEEE浮点转换

Java IBM到IEEE浮点转换,java,floating-point,ieee-754,Java,Floating Point,Ieee 754,java中是否有任何标准方法将IBM 370(字节形式)转换为IEEE格式?任何转换算法都会有所帮助 我试着写一个java代码,但我不明白哪里出错了。当我输入-2.000000000000000E+02时,我得到的值是IEEE格式的-140.0。在另一种情况下,当我输入3.14000000000000e+00时,我得到的值是IEEE格式的3.1712502374909226,对此的任何帮助都将不胜感激 private void conversion() { byte[] buffer =

java中是否有任何标准方法将IBM 370(字节形式)转换为IEEE格式?任何转换算法都会有所帮助

我试着写一个java代码,但我不明白哪里出错了。当我输入-2.000000000000000E+02时,我得到的值是IEEE格式的-140.0。在另一种情况下,当我输入3.14000000000000e+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;
}
private void conversion(){
byte[]buffer=//要读取的字节(8字节);
int符号=(缓冲区[0]&0x80);
//提取指数。
int exp=((缓冲区[0]&0x7f)-64)*4-1;
//将尾数标准化。
对于(int i=0;i<4;i++){//,因为每个十六进制数字有4位
if((缓冲区[1]&0x80)==0){
缓冲区=左移位(缓冲区);
exp=exp-1;
}
}
//将符号和尾数放回8字节的数字中
buffer=rightShift(buffer);//为更长的索引腾出空间
缓冲器=右移(缓冲器);
缓冲器=右移(缓冲器);
exp=exp+1023;//超出1023格式
int temp=exp&0x0f;//低4位进入B(1)
缓冲区[1]=(字节)((缓冲区[1]&0xf)|(临时*16));
缓冲区[0]=(字节)(符号|((exp/16)和0x7f));
}
专用字节[]右移(字节[]buf){
int newCarry=0;
int-oldcharry=0;
对于(int i=1;i0;i--){
newCarry=buf[i]&1;
buf[i]=(字节)((buf[i]&0x7F)*2+(oldcharry!=0?1:0));
旧进位=新进位;
}   
返回buf;
}

我可以看到您的问题有两种不同的解决方案:

  • 使用文本表示法作为中介
  • 直接转换

这包括从IBM浮点格式转换为IEE浮点格式的算法。

您在谈论IBM数字的哪种风格?有三种二进制浮点表示()和各种其他格式