由于所有Java浮点数,即浮点数和双浮点数,都在内部表示为位,所以我希望找到一个高效的算法来转换表示浮点数或双浮点数的字符串,并将其转换为相应的浮点数--我无法为它找到内置的库函数,所以我只好自己编写它。
长度为32的二进制字符串表示浮点数,其中长度为64的二进制字符串将转换为双字符串。所有浮动可以转换成双倍,而不会失去准确性。空格被忽略。
示例
"0 10000000 10010010000111111011011"以浮点数的形式变成3.141592。"1 11111111 00000000000000000000000"变成-infinity。"0 11111111 10010010000111111011011"变成了浮点NaN。"1 10000000000 0101101111110000101010001011000101000101011101101001"
成为与-e最接近的双值,即2.71828182845904509079559829843。到目前为止,我有大量的代码::
public static double ieee(String binString) throws Exception {
binString = binString.replace(" ", "");
if (binString.length() == 32) {
String exponentB = binString.substring(1, 9);
String mantissaB = binString.substring(9, 32);
int sgn = binString.charAt(0) == '0' ? 1 : -1;
int exponent = Integer.parseInt(exponentB, 2) - 127; // Biased by 127
double mantissa = 1 + Integer.parseInt(mantissaB, 2) / Math.pow(2, 23);
if (exponent == 128 && mantissa == 1)
return sgn == 1 ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
if (exponent == 128 && mantissa != 0)
return Double.NaN;
if (exponent == -127)
return sgn*Math.pow(2,-126)*(mantissa - 1);
return sgn*Math.pow(2, exponent)*mantissa;
}
else if (binString.length() == 64) {
String exponentB = binString.substring(1, 12);
String mantissaB = binString.substring(12, 64);
int sgn = binString.charAt(0) == '0' ? 1 : -1;
int exponent = Integer.parseInt(exponentB, 2) - 1023; // Biased by 1023
double mantissa = 1 + Long.parseLong(mantissaB, 2) / Math.pow(2, 52);
if (exponent == 1024 && mantissa == 1)
return sgn == 1 ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
if (exponent == 1024 && mantissa != 0)
return Double.NaN;
if (exponent == -1023)
return sgn*Math.pow(2,-1022)*(mantissa - 1);
return sgn*Math.pow(2, exponent)*mantissa;
}
else {
throw new Exception("Does not represent internal bits of a floating-point number");
}
}虽然到目前为止,我的代码还在工作,但是从代码的速度和数量来看,有什么最简洁或最快的方法来将IEEE-754二进制表示字符串转换为它的float或double?最有效的方法,并能很好地解释其效率和专门知识,是首选。
发布于 2018-07-16 23:02:59
这种方法可能更有效。当然,它更简单,更易于维护。
intFloat.intBitsToFloat(int)将其转换为float。对于双倍,请使用long和等效的Double方法。
简化的代码是否更有效?
唯一确定的方法是对其进行基准测试。但是根据你的代码所做的,我相信是这样的。
https://stackoverflow.com/questions/51371033
复制相似问题