C#浮点数的表示和基本运算

2019-12-30 14:40:36刘景俊

 

以单精度浮点数为例,可以得到其二进制的表示格式如下

 

S(第31位) P(30位到23位) M(22位到0位)

 

其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.)

为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。

2 浮点数的表示约定

单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。

(1) 当P = 0, M = 0时,表示0。

(2) 当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。

(3) 当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。

当我们使用.Net Framework的时候,我们通常会用到下面三个常量


Console.WriteLine(float.MaxValue); // 3.402823E+38
Console.WriteLine(float.MinValue); //-3.402823E+38
Console.WriteLine(float.Epsilon);  // 1.401298E-45
//如果我们把它们转换成双精度类型,它们的值如下
Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38
Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38
Console.WriteLine(Convert.ToDouble(float.Epsilon));  // 1.40129846432482E-45