gpt4 book ai didi

hash - 在 Fortran 中计算真实数组的校验和

转载 作者:行者123 更新时间:2023-12-05 05:16:54 25 4
gpt4 key购买 nike

我在 Fortran 中有一个大数组:

real, dimension(N) :: arr

而且我需要检查数组在程序的不同运行时是否完全相同。为此,我想创建数组的校验和进行比较。但是,我不知道要实现哪种算法。我看过 Flether 和 Adler 的算法,但无法阅读我找到的示例中提供的 C 语法。而且,我不知道如何用实数而不是字符/整数来实现它们。

在 C 实现中我发现它们返回:

return (b << 16) | a;

但我不知道如何实现 b << 16 Fortran 语言的一部分,或者如果这能很好地转化为实数。

最佳答案

我终于通过在 Fortran 中实现 Adler-32 解决了这个问题:

subroutine test_hash(var)
implicit none
real, dimension(N), intent(in) :: var
integer, dimension(N) :: int_var
integer :: a=1, b=0, i=1, mod_adler=65521, hash = 0

int_var = TRANSFER(var, a, nijk)

do i= 1, NIJK
a = MOD(a + int_var(i), mod_adler)
b = MOD(b+a, mod_adler)
end do

hash = ior(b * 65536, a)

print*, hash

end subroutine test_hash

我最终使用了 Fortran 内部函数 Transfer函数将 32 位实数转换为 32 位整数,因为这是算法所依赖的。在此之后我执行标准循环。使用 IOR按照@VladimirF 的建议运行并代表 b<<16作为b * 65536 @ja72 描述。最后,我将能够将哈希打印到控制台。

以这种方式实现它的原因是因为它比打开文件、计算每个文件的校验和更快。这样做的主要原因是因为有很多变量我需要经常检查哪个开关,因为我只是将它用于调试目的。

关于hash - 在 Fortran 中计算真实数组的校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49944038/

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