IEEE 754 浮点数

IEEE 754 浮点数

简单讨论双精度浮点数:double

double小数的计算表示公式如下:

(-1)^s * (1 + m/2^52) * 2^(e - 1023)

单精度小数:(-1)^s * (1 + m/2^23) * 2^(e - 127)

在双精度浮点数中:

  • s (sign) 表示符号位,占1bit
  • e (exponent) 表示指数,占11bit,取值 [0, 2047]
  • m (mantissa) 表示尾数,占52bit, 取值 [0, 2^52]

1023 由来:e 指数部分采用无符号数表示,可以方便指数之间的比较(如果是有符号数则为采用补码表示法,会使比较变得困难),为了表示更小的数,因此需要减掉一个值,称为指数偏移值。双精度:2^(e - 1) - 1 = 2^(11 - 1) - 1 = 1023,单精度:2^(8 - 1) - 1 = 127。

2^52 由来:尾数的表示长度 [0, 2^52]。双精度:2^52,单精度:2^23。

m 的值为 2^n 到浮点数的值比上 2^n 到 2^(n+1) 的值 乘以 2^52(如果计算结果有小数,将会四舍五入,因此会产生误差)。

如:5.0

正数,s = 0

2^2 < 5.0 < 2^(2 + 1),因此 e - 1023 = 2 => e = 1025

m = ((5.0 - 4) / (2^3 - 2^2) * 2^52 = 2^(-2) * 2^52 = 2^50

因此表示出来:0100000000010100000000000000000000000000000000000000000000000000

public class Main {

    public static void main(String[] args) {
        System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(5.0)));
	System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(5.0f)));
    }
}

指数逼近函数

public static double getSigmoidValue(double factor) {
	long middle = (long) (1512775 * factor + 1072632447)
	double approximation = Double.longBitsToDouble(middle << 32);
	return approximation;
}

小数表示原文

# RFC 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×