• 理解浮点数的储存规则



    早就想知道浮点数的存储原理; 从 Single 开始理解.

    Single(单精度浮点数 - 32 位):
    s e f
    1 8 23

    如浮点数: 13.625 (1*101 + 3*100 + 6*10-1 + 2*10-2 + 5*10-3)

    其二进制表示是: 1101.101(1*23 + 1*22 + 0*21 + 1*20 + 1*2-1 + 0*2-2 + 1*2-3)

    系数(或叫尾数)规范化: 1101.101 = 1.101101 * 23

    系数规范化以后, 都可成为 1.xxxxx... 的样子, 所以为节省空间, "点" 前面的 1 就无须储存了.

    这样可以知道此数的指数(e)是 00000011(十进制的 3)、尾数(f) 是 101101(省去了前面的 1. 回算时必须加上)

    符号位(s)只占一个二进制位, 非常简单: 0 是正, 1 是负.

    指数(e)在这里还有一个规则: 实际储存 = e+127; 这是为了协调指数的正负.

    重新落实最后的结果:
    s: 应该是 0, 这里是个正数;
    e: 应该是: 10000010, 这对应 10 进制的 130(3+127);
    f: 10110100000000000000000, 尾数占 23 位.
    结果应该是: 01000001010110100000000000000000

    测试下:

    {查看二进制的函数}
    function ToBin(p: PByteArray; b: Integer): string;
    var
      i,j: Integer;
    begin
      Result := StringOfChar('0', b * 8);
      for i := 0 to b - 1 do for j := 0 to 7 do
        if Odd(p^[b-1-i] shr j) then Result[i*8 + 8 - j] := '1';
    end;
    
    {测试一}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      f1,f2: Single;
      s1,s2: string;
    begin
      f1 := 13.625;
      f2 := -13.625;
      s1 := ToBin(@f1, SizeOf(f1));
      s2 := ToBin(@f2, SizeOf(f2));
      Memo1.Lines.Add(s1); //01000001010110100000000000000000
      Memo1.Lines.Add(s2); //11000001010110100000000000000000
    end;
    
    {测试二}
    procedure TForm1.Button2Click(Sender: TObject);
    var
      f1,f2: Single;
    begin
      asm
        mov f1, 01000001010110100000000000000000B
        mov f2, 11000001010110100000000000000000B
      end;
      ShowMessageFmt('%g, %g', [f1,f2]); //13.625, -13.625
    end;
    

    其他浮点数的储存规则:

    Double 或 Real(双精度浮点数 - 64 位):
    s e f
    1 11 52

    Extended(扩展精度浮点数 - 80 位):
    s e i f
    1 15 1 63

    Real48(已经淘汰的 48 位浮点数):
    s f e
    1 39 8


  • 相关阅读:
    RadRails插件在MyEclipse的安装
    如何取消电脑的自动播放功能
    程序员怎么提高自己的技术书籍
    PHP网站,两个域名在一个空间,如何做301转向
    下载和安装Tcl/Tk:
    Hibernate 3.0配置Proxool 0.8.3数据库连接池
    CSS滤镜属性详解
    使用InstantRails搭建Ruby On Rails开发环境
    hibernate 二级缓存配置
    Ruby on rails开发从头来(windows)(二)创建项目和第一个Hello world
  • 原文地址:https://www.cnblogs.com/del/p/1727247.html
Copyright © 2020-2023  润新知