Fortran Coder

楼主: SongAngel
打印 上一主题 下一主题

[数值问题] 浮点型精度求解决

[复制链接]

716

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
624 元
贡献
319 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

板凳
发表于 2022-11-21 12:55:18 | 只看该作者
本帖最后由 楚香饭 于 2022-11-21 13:00 编辑

6-7位。
因为计算机使用的时二进制,而不是十进制。
一般计算机用整型来表达整数,用定点数和浮点数来表达小数。(目前大多数系统上用浮点数,极少用定点数)
浮点数,类似二进制的科学计数法。

普遍采用的浮点数标准是 IEEEE 浮点数标准,IEEE 单精度浮点数有 32 位,双精度有 64 位。
  两者都是分为 s e m 三段,代表符号位,指数位和尾数位。分段规则如下:
      ┏━━━┯━┯━┯━┓
      ┃ 精度 │s │e │m ┃
      ┠───┼─┼─┼─┨
      ┃单精度│1 │8 │23┃
      ┠───┼─┼─┼─┨
      ┃双精度│1 │11│52┃
      ┗━━━┷━┷━┷━┛
  最终计算公示为:n = ( -1 ) ** s * m * ( 2 ** e )
因为单精度有23位二进制表示m段,所以转换成十进制的精度为 log10(2**23) = 6.923(也就是6到7位之间)
  现在详细解释一下各段的含义(以单精度 50.5 为例):
  (1) s 段:s 段为 1,表示负数,否则表示正数。50.5 是正数,因此,s 段取为 0。
  (2) e 段:e 段可以认为是一个整型。比如取值为 10000100 ,即十进制的 132。但参与最后计算的 e 并不是直接的 132。而是 132 于偏移量 127 的差。也就是 5。(所以才能出现负指数)(双精度的偏移量为1023)
  (3) m 段:m 段的每一位表示一个数值,取为 0 则不计入总数,取为 1 则计入总数。
       第一位表示 1/2,第二位表示 1/4,第三位表示 1/8 ....
       比如取为:10010100000000000000000。则表示 1/2 + 1/16 + 1/64 = 0.578125。在这个基础上 + 1。即 1.578125 最终参与计算。
      
  最后的计算 n = ( -1 ) ** 0 * 1.578125 * ( 2 ** 5 ) = 50.5
  将以上三段写在一起:
      ┏━┯━━━━┯━━━━━━━━━━━━┓
      ┃s │ e    │    m           ┃
      ┠─┼────┼────────────┨
      ┃0 │10000100│10010100000000000000000 ┃
      ┗━┷━━━━┷━━━━━━━━━━━━┛
  最后写在一起:01000010010010100000000000000000
  每隔 8 位隔开:
      ┏━━━━┯━━━━┯━━━━┯━━━━┯━━━━┓
      ┃ 字节  │01000010│01001010│00000000│00000000┃
      ┠────┼────┼────┼────┼────┨
      ┃十六进制│  42  │  4A  │  00  │  00  ┃
      ┗━━━━┷━━━━┷━━━━┷━━━━┷━━━━┛
  最终就表示为:42 4A 00 00
  至于储存是是否翻转为:00 00 4A 42,则依赖于具体平台。微机平台上翻转,工作站上不翻转。

19

帖子

5

主题

0

精华

入门

F 币
110 元
贡献
61 点
沙发
 楼主| 发表于 2022-11-21 11:48:05 | 只看该作者
其实这个解决方法也很简单,就是将计数变量改为双精度,就不存在上述问题了,但是心里就是想搞清楚导致上述问题出现的原因是什么,搞不清楚太难受了。查看相关资料说是单精度的浮点数的有效位数为6~7位,这个有效位指的具体是什么呢,什么是6位,什么时候是7位,比如说下面代码的输出结果为1.000000       1.000001       1.000001       1.000002       1.000000,这是不是代表具有7为有效数字,而最后一位则是不准确的,是需要按照四舍五入进行估计的呢
[Fortran] 纯文本查看 复制代码
    Program Test
    Real A,B,C,D,E
    A=1.000000
    B=1.000001
    C=1.0000014
    D=1.0000015
    E=1.0000001
    Write(*,*) A,B,C,D,E
    End Program Test
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-6-12 10:58

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表