1

所以我有以下积分,我需要在数字上做:

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

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

我没有多少运气在谷歌上搜索以下内容,你如何处理 fortran 中的大量数字,而不是高精度,我不在乎我是否知道它超过双精度,最后我只会记录日志,但我只需要能够处理大量数字,直到我可以记录日志..

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

干杯

4

3 回答 3

3

这可能是扩展评论而不是答案,但无论如何......

正如您已经观察到的那样,Fortran 没有配备开箱即用的工具来处理e^2000. 我认为你有3个选择。

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

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

  3. 使用高精度(通常也称为任意精度或多精度)算术库。您最喜欢的搜索引擎会为您找到其中的一些,有些是用 Fortran 编写的(因此易于集成),有些是用 C/C++ 或其他语言编写的(因此集成起来稍微困难一些)。您可以从Lawrence BerkeleyGNU bignum 库开始搜索。

  4. (是的,我知道我写过您有 3 个选项,但您的问题表明您还没有准备好考虑这一点)您可以编写自己的高精度/任意精度/多精度函数。Fortran 提供了构建这样一个库所需的一切,在该领域已经完成了很多工作可以学习,并且可能会引起您的兴趣。

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

于 2013-07-25T10:43:13.053 回答
1

我同意 High Peformance Mark 的观点,这里最好的数字选择是首先使用分析来扩展或简化结果。

我会提到,如果您确实想强制使用它,gfortran(从 4.6 开始,带有libquadmath库)支持四倍精度实数,您可以通过选择适当的 kind来使用它。只要您的答案(以及中间结果!)不会比您所描述的大太多,这可能会起作用,但通常会比双精度慢得多。

于 2013-07-25T13:50:35.530 回答
1

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

另外,退后一步,问你为什么要通过计算这个值来完成。例如,我最近不得不调试为什么我从计算流体的蒸汽压以查看是否发生冷凝的属性相关性中得到奇怪的结果。我花了很长时间试图了解将温度输入相关性有什么问题,直到我意识到导致错误的情况是对蒸汽爆炸的模拟。问题不在于数字,而在于在字面爆炸期间检查冷凝的逻辑。物理上,冷凝检查没有任何意义。真正的问题是代码问了一个不必要的问题。它已经有了答案。

我强烈推荐 Forman Acton 的Numerical Methods That (通常) Work and Real Computing Made Real。两者都专注于此类问题,并提出了驯服无礼计算的技术。

于 2013-08-10T18:12:15.283 回答