Fortran Coder

查看: 14273|回复: 1
打印 上一主题 下一主题

[数值问题] 如何解决:run-time error M6104: MATH - floating-point error: overflow

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
10 元
贡献
4 点
跳转到指定楼层
楼主
发表于 2014-4-5 23:24:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
菜鸟一枚,要算这个问题

\sin(x) = \frac{x}{1}-\frac{x^3}{3!}+\frac{x^5}{5!}-\cdots+(-1)^{n-1}\frac{x^{2n-1}}{(2n-1)!}

以下是我的程序
[Fortran] 纯文本查看 复制代码
 INTEGER SIGN
READ *, N, X
SUM = X
SIGN = 1
FACT = 1.0
P = X
DO 10, I=2,N
SIGN = (-1)*SIGN
FACT = FACT * (2.0*I-2) * (2.0*I-1)
P = P * X**2
SUM = SUM + SIGN*P/FACT
10 CONTINUE
PRINT *, SUM
END


输入N=3,x=1.5708,可以得到结果1.004......
但是输入N=100,x=1.5708,就会报错:run-time error M6104: MATH - floating-point error: overflow
不知如何解决。求大神指点!多谢!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

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

沙发
发表于 2014-4-6 08:23:32 | 只看该作者
计算机里用字节表示一个数,字节总是有限的,无法表达无穷的实数。

所以,永远记住,浮点数既有表达范围,又有表达精度。(都是有限的)

100级次,算200的阶乘,计算机无法容纳如此巨大的数。我试了一下,real(16) 是可以的(如果你的编译器允许real(16)的话)

所以造成了浮点数溢出。

一般是通过算法来解决,这本例中,fact 和 p 的值在后面是没有作用的,所以可以放一起,存放 p/fact 的值。虽然 p 和 fact 都是很大的数,但是他们除掉以后,就不大了。

[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  Implicit None
  INTEGER SIGN , i , n
  Real :: x , sum , fact , p
  READ *, N, X
  SUM = X
  SIGN = 1
  P = X
  DO I = 2 , N
    SIGN = (-1)*SIGN
    !FACT = FACT * (2.0*I-2) * (2.0*I-1)
    P = P * X**2 / ( (2.0*I-2) * (2.0*I-1) )
    SUM = SUM + SIGN * P
  End Do
  PRINT *, SUM
End Program www_fcode_cn
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-23 18:03

Powered by Tencent X3.4

© 2013-2024 Tencent

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