点数分为单_ֺ和双_ֺ,Java中的单精度和双精度分别ؓfloat和double.你们知道float和double是怎么存储的吗?
float?个字?double?个字?Z方便赯,q里只讨论floatcd.
float其实和一个int型的大小是一L,一?2?W一位表C符?2-9表示指数,后面23位表C小数部?
q里只D一个例?希望能抛砖引?是研究一下QҎ(gu)0.1的存储Ş?先运行这个程?
public class Test{
public static void main(String[] args) {
int x = 0x3d800000;
int i = 1 << 22;
int j = 1 << 4;
float f = 0.1f;
int y = Float.floatToIntBits(f);
float rest = f - ( (float) 1) / j;
while (i > 0) {
j <<= 1;
float deta = ( (float) 1) / j;
if (rest >= deta) {
rest -= deta;
x |= i;
}
i >>= 1;
}
pr(x);
pr(y);
}
static void pr(int i) {
System.out.println(Integer.toBinaryString(i));
}
}
l果:
111101110011001100110011001101
111101110011001100110011001101
E序说明:
int x=0x3d80000;
因ؓ点表示形式?.f*2n-127我们要表C?.1,可以知道n-127=-4,到n=123
W号为正,可知??001111011,暂时不考虑后面?3位小?所以我们先假设x=0x3d800000;
int i = 1 << 22;
i初始为第双vW?3位ؓ1,是x的第10?
int j = 1 << 4;
i初始?,因ؓn-127?4,q里是ؓ了求它的倒数.
float f = 0.1f;
int y = Float.floatToIntBits(f);
y是它的32位表C?
float rest = f - ( (float) 1) / j;
q个rest表示除了1.f中的1剩下?也就?.f
while (i > 0) {
j <<= 1;
float deta = ( (float) 1) / j;
if (rest >= deta) {
rest -= deta;
x |= i;
}
i >>= 1;
}
q个循环来计?3位小数部?如果rest不小于deta,表示q个位可以置?.
其他的不多说?输入l果是一L,可以?.1q个点数肯定是不精的,但是0.5可以_的表C?xZ么吧.
转至 www.csdn.net