Fortran 90中大数的数值积分

时间:2013-07-25 07:08:51

标签: fortran90 numerical largenumber

所以我有以下需要以数字方式进行的积分:

Int[Exp(0.5*(aCosx + bSinx + cCos2x + dSin2x))] x=0..2Pi

问题是x的任何给定值的输出都可能非常大,e ^ 2000,所以比我在双精度上处理的要大。

我没有太多的运气谷歌搜索以下,你怎么处理fortran中的大数字,而不是高精度,我不在乎,如果我知道它超出双精度,最后我将只是记录日志,但我只需要能够处理大数字,直到我可以记录日志..

是否有能够处理任意大数字的集成包? Mathematica显然可以......所以必须有这样的东西

干杯

3 个答案:

答案 0 :(得分:3)

这可能是一个扩展的评论而不是一个答案,但无论如何都要进行......

正如您已经观察到的那样,Fortran没有配备开箱即用的设备,可以处理e^2000这么大的数字。我认为你有3种选择。

  1. 使用数学将您的问题减少到可以(或许多相关的问题)落在您的Fortran编译器可以计算的数值范围内的问题。

  2. 使用 Mathematica 或其他计算机代数系统之一(例如Maple,SAGE,Maxima)。所有(我认为)这些都可以集成到Fortran程序中(具有不同程度的难度和集成)。

  3. 将库用于高精度(通常称为 arbitray-precision 多精度)算法。您最喜欢的搜索引擎将为您提供一些这些,一些用Fortran编写(因此易于集成),一些用C / C ++或其他语言编写(因此稍微难以集成)。您可以在Lawrence Berkeleythe GNU bignum library开始搜索。

  4. (是的,我知道我写过你有3个选项,但你的问题表明你还没有准备考虑这个)你可以编写自己的高/任意/多精度函数。 Fortran提供了构建这样一个库所需的一切,在该领域已经做了大量的工作来学习,并且它可能是你感兴趣的东西。

  5. 在实践中,通常在诉诸计算机之前尽可能多地应用数学是有意义的,该过程不仅可以帮助解决问题,还可以指导您选择或构建程序以解决剩下的问题。问题

答案 1 :(得分:1)

我同意High Peformance Mark,这里的最佳选择是使用分析来首先缩放或简化结果。

我要提一下,如果你确实想暴力破解它,gfortran(截至4.6,libquadmath库)支持quadruple precision实数,你可以使用selecting the appropriate kind }。只要你的答案(以及中间结果!)没有比你描述的那么大,那可能会有效,但它通常会比双精度慢得多。

答案 2 :(得分:1)

这需要更深入地研究您要解决的问题以及基础数学的行为。为了增加Mark和Jonathan已经提供的好建议,考虑将指数和触发函数扩展为泰勒级数并截断到所需的精度级别。

此外,退后一步,通过计算此值来询问您为什么要尝试完成。作为一个例子,我最近不得不调试为什么我从属性相关性得到了古怪的结果,该相关性计算流体的蒸汽压力以查看是否发生冷凝。我花了很长时间试图了解温度被输入相关性的问题,直到我意识到引起误差的情况是模拟蒸气爆炸。问题不在于数字,而在于在文字爆炸期间检查冷凝的逻辑;在物理上,凝结检查毫无意义。真正的问题是代码问了一个不必要的问题;它已经有了答案。

我强烈推荐Forman Acton的 Numerical Methods That (Usually) WorkReal Computing Made Real。两者都关注这样的问题,并建议驯服不合理的计算技术。