24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2025级博士研究生招生报考通知
查看: 3601  |  回复: 8

liming9398

金虫 (正式写手)

[求助] fortran中到底该如何比较两个实数是否相等

如果都是real(4)该如何比较,都是real(8) 又该如何比较?是比较绝对误差还是相对误差,哪个误差都说要小于一个比较小的数,到底应该选多小呢,不同的书说法不一样,又说-4次方的,又说-8次方的,还有的用机器精度(-8次方和-16次方,双精度表示0.24时,实际存储的是0.239999994635582,这个绝对误差本身就是-9次方量级啊,显然不是-16方的量级啊??)到底哪个误差该选多大,有没有一个统一的标准或者最好的选择?
回复此楼

» 收录本帖的淘帖专辑推荐

Ouwen's Greenhouse

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

感谢参与,应助指数 +1
这个要看你自己觉得多大是合适的,你要是认为 0.2400000与0.2399999是相等的,你就设为两者之差小于 0.000001好了……,当然,一般也与你的变量的精度有关
2楼2012-03-31 09:28:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖


liming9398: 金币+1 2012-03-31 11:18:40
另外,你看一下 gfortran 中这个程序的输出:
CODE:
  program test
      double precision a
      real b
      a=0.24d0
      b=0.24
      write(*,*) a
      write(*,*) b
   end program test

0.23999999999999999
  0.23999999
3楼2012-03-31 09:32:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

【答案】应助回帖


感谢参与,应助指数 +1
liming9398: 金币+1 2012-03-31 11:19:03
我来吐槽一下对于“精度”的理解应该怎样吧

首先,我们应该了解IEEE754标准规定的单精度和双精度是怎样的

关于IEEE754标准:http://en.wikipedia.org/wiki/IEEE754
关于单精度:http://en.wikipedia.org/wiki/Sin ... oating-point_format
关于双精度:http://en.wikipedia.org/wiki/Dou ... oating-point_format

注意:尾数部分(fraction)是二进制表示的!

单精度的尾数有23位,所以它的最小单位是2的-24次方,约等于5.96E-8;双精度的尾数有52位,所以它的最小单位是2的-53次方,约1.11E-16,常说的“机器精度”是这个意思

领悟十进制转二进制的局限性的话,你就知道为啥就连quadruple precision四精度都不可能精确表达0.1这么简单一个十进制小数了【同时,就算是单精度,也能够精确表达2^-149这个如此微小的十进制小数(约1.4E-45)】,楼主最初问题的答案也呼之欲出了:这个要根据实际的需求来定,因为一般的计算里面,大部分小数都不是被精确表示的,不能教条主义地选择阈值的大小
4楼2012-03-31 09:49:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

补充一点,关于显示,会根据指定的十进制小数的“显示位数”来进行四舍五入

这并不代表存储的数据就是那个样子的
5楼2012-03-31 09:51:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhangyaocun

木虫 (正式写手)

I do it my way!
6楼2012-03-31 12:39:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

【答楼主问】
引用回帖:
点到平面的距离为0表示在平面内,那么这个误差应该取多大(比如双精度时)

取一个你能接受的精度
引用回帖:
如果是表示位数造成的误差,为什么不直接取你说得哪个机器精度作为阈值呢?我觉得这样应该是最准确的啊(我是说比如双精度既然精度能到10进制的-15次方,为什么还要取成-6,-8次方呢?这样不是没充分利用数据类型的精度吗?)

这是个好问题。这并不是“没有充分利用数据类型”的精度,拿单精度为例吧,它有8位二进制指数位,和23位二进制小数位,加上隐含的前置1的尾数开头,相当于一共24位二进制有效数字。考虑一下很类似的科学计数法吧,假如我有一个十进制小数,但是它的整数部分不是零,比如:

12345.1

里面的12345的部分,势必要占去有效数字的一些位,这样剩下的供给0.1的有效二进制数字就没有24位那么多了,也就是我们不能使用2^-24约等于5.96E-8作为单精度小数的阈值了
引用回帖:
既然显示的是舍入后的,究竟怎么样才能看到真实存储的实数呢?多谢!

还是以12345.1为例吧,转成二进制小数的话,等于

11000000111001.00011 0011 0011 0011 ......

后面是无限循环二进制小数,去掉默认的最高位1,剩下的尾数都会放到23位的fraction里面(嗯,exponent部分是在范围内的,这里就不作讨论了),于是这个小数实际上会被截断成:

11000000111001.00011 0011 0

所以等于精确的十进制为:12345.099609375,绝对误差为0.000390625,这个绝对误差就要远远大于10^-8的量级了

嗯,楼主可以阅读下我上面提到的链接,理解之后就好办了
7楼2012-03-31 16:20:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

嗯,上面最后一个例子讲的是把12345.1放到单精度里面...
8楼2012-03-31 16:23:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hklgxm

金虫 (小有名气)

那么也就是说,在Fortran里面判断两个实数是否相等就只能用相对误差小于一个值来判断咯?
9楼2015-10-31 16:02:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 liming9398 的主题更新
信息提示
请填处理意见