gpt4 book ai didi

if-statement - IF 语句以相反的方式工作

转载 作者:行者123 更新时间:2023-12-05 00:50:56 24 4
gpt4 key购买 nike

我有一个子程序 ran_init (length),其中一个 IF 语句不能正常工作。

下面的代码是我原始代码的高度简化版本:

MODULE ran_state
USE nrtype
IMPLICIT NONE

INTEGER, PARAMETER :: K4B = SELECTED_INT_KIND ( 9 )
INTEGER ( K4B ), PARAMETER :: hg = HUGE ( 1_K4B ), hgm = -hg, hgng = hgm - 1
INTEGER ( K4B ), SAVE :: lenran = 0

CONTAINS

SUBROUTINE ran_init ( length )
USE nrtype; USE nrutil, ONLY: nrerror
IMPLICIT NONE

INTEGER ( K4B ), INTENT ( IN ) :: length
INTEGER ( K4B ) :: hgt

IF ( length < lenran ) RETURN
hgt = hg
PRINT *, hgt, hgt + 1, hgng, hgt + 1 - hgng
IF ( hgt + 1 .NE. hgng ) CALL nrerror ( 'ran_init: arith assump 3 fails' )

END SUBROUTINE

END MODULE ran_state

此代码返回结果:

  2147483647 -2147483648 -2147483648           0
nrerror: ran_init: arith assump 3 fails
STOP program terminated by nrerror

可以看出 hgt + 1hgng 的值是相等的,但是在 IF 语句中这些值被解释为不平等。

为什么会发生这种情况?

UPD №1一些技术细节:

  1. 我使用 gfortran 作为编译器
  2. 命令 gfortran --version 返回
GNU Fortran (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
  1. 我用标志编译我的程序
-O2 -Wall -Wextra -fbacktrace -fcheck=all -g -o

优化程度不影响结果。

  1. 我的操作系统是 Ubuntu 16.04LTS 64 位

UPD №2

我不知道为什么,但是如果创建一个新变量,例如 INTEGER (K4B) 类型的 hgtp 并替换行

hgt = hg
PRINT *, hgt, hgt + 1, hgng, hgt + 1 - hgng
IF ( hgt + 1 .NE. hgng ) CALL nrerror ( 'ran_init: arith assump 3 fails' )

有线条

hgt = hg
hgtp = hgt + 1
PRINT *, hgt, hgt + 1, hgng, hgt + 1 - hgng
IF ( hgtp .NE. hgng ) CALL nrerror ( 'ran_init: arith assump 3 fails' )

IF 语句开始解释条件hgtp .NE。 hng 为真。

最佳答案

您遇到了整数溢出,这是 Fortran 中未定义的操作。这意味着 Fortran 处理器(编译器和运行时)可以做任何它喜欢的事情,比如做一些或多或少的随机计算,用错误消息中止编译,在运行时用错误消息中止程序,或者启动火箭开始第三次世界大战。

这意味着如果发生整数溢出,您不能依赖某些特定行为。通常编译器会尽可能快地优化代码,假设不会发生溢出(因为这是未定义的行为,程序员有责任确保程序不会进入这种状态)。

另外,这里有两种溢出:

  • hgt + 1 有点明显,因为 hgt 等于 HUGE()
  • hgm - 1 也是溢出。这不是使用整数的二进制补码表示的硬件的溢出(实际上就是说,这些天在外面的所有硬件都可能是一些博物馆作品),但是 Fortran 型号是对称的,所以在Fortran 标准,这是一个溢出,再一次,所有的赌注都没有了。

(以上假设您在默认整数与 K4B 具有相同类型的系统上运行,这应该是当今大多数系统,除非您使用某些 - fdefault-integer-8 或此类选项)

关于if-statement - IF 语句以相反的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73403900/

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