Fortran Coder

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

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

[复制链接]

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

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

楼主
发表于 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,则依赖于具体平台。微机平台上翻转,工作站上不翻转。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

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

沙发
发表于 2022-11-21 14:21:06 | 显示全部楼层
了解一下大数吃小数的问题。

用十进制来距离,你会容易理解一些,理解之后自己想到二进制上就行了。

1.000e20 + 1.000e16 = 1.0001e20 但只存储三位小数,则还是 1.000e20

1.000e20 + 1.000e17 = 1.001e20 只存储三位小数,结果是 1.001e20

为什么+1e16不行,但+1e17就行了呢?

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

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

板凳
发表于 2022-11-21 14:22:02 | 显示全部楼层
实际上,大量数据的累计,要么用整形(因为整形在有效范围内是完全精确表达的,不存在精度问题)
要么,用乘法。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

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

地板
发表于 2022-11-21 17:50:27 | 显示全部楼层
你描述的基本对。但是你想复杂了。
都算不上泰勒级数,它就是个等比数列的线性组合。只不过十进制公比是10,而二进制公比是2

十进制可拆成:
(-1)^s10^e\sum_{i=1}^{m}k10^{i}
二进制就拆成
(-1)^s2^e\sum_{i=1}^{m}k2^{i}

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

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

5#
发表于 2022-11-22 08:39:46 | 显示全部楼层
SongAngel 发表于 2022-11-21 21:50
是的,就是等比数列的线性组合,不过十进制和二进制的公比应该分别是0.1和0.5吧。 ...

对对对,不严谨了,不严谨了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-15 03:15

Powered by Tencent X3.4

© 2013-2024 Tencent

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