gpt4 book ai didi

perl - 与其他语言相比,Fortran 在数值精度方面是否存在固有的局限性?

转载 作者:行者123 更新时间:2023-12-04 16:23:50 28 4
gpt4 key购买 nike

在进行简单的编程练习时,我生成了一个 while 循环(Fortran 中的 DO 循环),它旨在在实际变量达到精确值时退出。

我注意到由于使用了精度,从未满足相等性并且循环变得无限。当然,这并非闻所未闻,建议不要比较两个数字是否相等,最好查看两个数字之间的绝对差值是否小于设定的阈值。

我发现令人失望的是我必须将这个阈值设置得有多低,即使变量为 double ,才能让我的循环正确退出。此外,当我用 Perl 重写这个循环的“精炼”版本时,我在数值精度方面没有问题,并且循环退出正常。

由于产生问题的代码非常小,在 Perl 和 Fortran 中,我想在这里重现它,以防我掩盖了一个重要的细节:

Fortran 代码

PROGRAM precision_test
IMPLICIT NONE

! Data Dictionary
INTEGER :: count = 0 ! Number of times the loop has iterated
REAL(KIND=8) :: velocity
REAL(KIND=8), PARAMETER :: MACH_2_METERS_PER_SEC = 340.0

velocity = 0.5 * MACH_2_METERS_PER_SEC ! Initial Velocity
DO
WRITE (*, 300) velocity
300 FORMAT (F20.8)
IF (count == 50) EXIT
IF (velocity == 5.0 * MACH_2_METERS_PER_SEC) EXIT
! IF (abs(velocity - (5.0 * MACH_2_METERS_PER_SEC)) < 1E-4) EXIT
velocity = velocity + 0.1 * MACH_2_METERS_PER_SEC
count = count + 1
END DO

END PROGRAM precision_test

Perl 代码
#! /usr/bin/perl -w
use strict;

my $mach_2_meters_per_sec = 340.0;

my $velocity = 0.5 * $mach_2_meters_per_sec;

while (1) {
printf "%20.8f\n", $velocity;
exit if ($velocity == 5.0 * $mach_2_meters_per_sec);
$velocity = $velocity + 0.1 * $mach_2_meters_per_sec;
}

Fortran 中注释掉的行是我需要用于循环正常退出的行。注意阈值设置为1E-4,我觉得挺可怜的。

变量的名称来自我正在执行的基于自学的编程练习,没有任何相关性。

目的是当速度变量达到 1700 时循环停止。

以下是截断的输出:

Perl 输出
    170.00000000
204.00000000
238.00000000
272.00000000
306.00000000
340.00000000

...
   1564.00000000
1598.00000000
1632.00000000
1666.00000000
1700.00000000

Fortran 输出
    170.00000000
204.00000051
238.00000101
272.00000152
306.00000203
340.00000253

...
   1564.00002077
1598.00002128
1632.00002179
1666.00002229
1700.00002280

如果 Fortran 的准确性很差,它的速度和并行化的简易性有什么好处?让我想起了做事的三种方式:
  • 正道
  • 走错路
  • Max Power Way

  • “这不是走错路了吗?”

    “是啊!但是更快!”

    别开玩笑了,我一定是做错了什么。

    与其他语言相比,Fortran 在数值精度方面是否存在固有的局限性,还是我(很可能)有错?

    我的编译器是双核 AMD Opteron @ 1 GHZ 上的 gfortran(gcc 版本 4.1.2)、Perl v5.12.1。

    最佳答案

    您的赋值意外地将值转换为单精度,然后又转换回 double 。

    尝试制作您的 0.1 *0.1D0 *你应该看到你的问题得到解决。

    关于perl - 与其他语言相比,Fortran 在数值精度方面是否存在固有的局限性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3331818/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com