Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Fortran中的长整数_Loops_Fortran_Largenumber - Fatal编程技术网

Loops Fortran中的长整数

Loops Fortran中的长整数,loops,fortran,largenumber,Loops,Fortran,Largenumber,我正在尝试处理大量的数据(~10^14),我需要能够存储它们并迭代该长度的循环,即 n=SOME_BIG_NUMBER do i=n,1,-1 我试过常用的星形符号,kind=8等等,但似乎什么都不起作用。 然后我检查了巨大的内在函数,代码: program inttest print *,huge(1) print *,huge(2) print *,huge(4) print *,huge(8) print *,huge(16) print *,huge(32) end program

我正在尝试处理大量的数据(~10^14),我需要能够存储它们并迭代该长度的循环,即

n=SOME_BIG_NUMBER
do i=n,1,-1
我试过常用的星形符号,
kind=8
等等,但似乎什么都不起作用。 然后我检查了
巨大的
内在函数,代码:

program inttest

print *,huge(1)
print *,huge(2)
print *,huge(4)
print *,huge(8)
print *,huge(16)
print *,huge(32)

end program inttest
在所有情况下都生成2147483647号。为什么会这样?我在64位机器上使用gfortran(f95)


如果我需要一个bignum库,人们会推荐哪一个?

我使用的gfortran版本,Mac上的4.3、4.4和4.5,支持8字节整数。在Fortran>=90中选择变量类型的最佳方法是使用内部函数指定所需的精度。尝试:

integer, parameter :: LargeInt_K = selected_int_kind (18)
integer (kind=LargeInt_K) :: i, n
获取至少18个十进制数字,通常为8字节整数

使用gfortran 4.3,巨大(1_LargeInt_K)输出9223372036854775807。当您编写巨型(1)等时,默认情况下该常量是一个默认整数,这里显然是4字节,因为巨型返回2147483647。因此,有时您需要指定常量的精度,而不仅仅是变量——更常见的是,当人们在实际常量上丢失有效数字时,这会使人感到困惑,而实际常量默认为单精度

也看到


通常gfortran具有命令名gfortran。f95可以是不同的编译器吗?试试“gfortran-v”和“f95-v”。

您误解了
巨大的
函数的精确定义
maging(num)
返回与
num
具有相同种类和类型的最大数字。返回的值的种类和类型也与
num
相同。由于您的所有输入值都是(默认)整数
巨大
,因此正确地返回最大的默认大小整数

maging(num)
不返回带有
kind=num的最大整数。
maging(num)
也不会返回
num
字节中可表示的最大数字。虽然许多编译器对4字节和8字节整数使用
integer(kind=4)
integer(kind=8)
等,但语言标准不能保证这一点,也不能依赖于它的可移植性


@MSB的回答告诉你如何做你想做的事,我只是想澄清一下

摘要:考虑编译器选项。

自从我使用FORTRAN以来,我已经用了很长一段时间了,我不记得使用过巨大的(),但我稍微看了一下这个。我的英特尔Linux机器有gfortran 4.1.2。我发现我必须在启用-fdefault-integer-8选项的情况下进行编译,以使其适用于64位整数。具体而言,使用此代码:

      program inttest
      print *, huge(1)
      end program inttest
运行

$gfortran inttest.for

创建了一个可执行文件,该文件打印:

2147483647

但是,运行:

$gfortran-fdefault-integer-8 inttest.for

生成了一个可执行文件,该文件提供了以下输出:

9223372036854775807

另外,当我将一个变量声明为integer*8并在编译时没有使用-fdefault-integer-8选项时,我得到了一个错误。守则:

  program inttest2
  integer*8  test_int
  test_int = 9223372036854775807
  print *, test_int
  end program inttest2
运行

$gfortran inttest2.0用于

导致

在文件inttest.for中:4

  test_int = 9223372036854775807  
                               1 
错误:对于(1)处的类型,整数太大

然而,当我使用-fdefault-integer-8选项编译时,一切都很顺利,我得到了一个打印

9223372036854775807

也许还有其他gfortran选项会有用,但我没有进一步调查


当然,这仍然不能得到10^14,但它可能有助于解释您看到的结果。

您是否将变量声明为整数*8?在循环中迭代~10^14次?你知道那要花多长时间吗?我想你需要重新考虑你的算法。谢谢。我不知道巨无霸是这样工作的,但现在很明显了。我刚刚发现我的主要问题是没有转换文本,我会写n=123456…9(kind=blah)。写入n=12…9_long,其中long=selected_int_kind(13)可以正常工作。gfortran编译时警告选项之一会通知您常量太大。Try:-fimplicit none-Wall-Wline truncation-Wcharacter truncation-Wsurprising-Waliasing-Wimplicit interface-Wunused parameter-fcheck=all-fbacktrace for gfortran 4.5。或者-fbounds检查早期版本,而不是-fcheck all选项-fdefault-integer-8将默认整数设置为8字节,并且不需要使用8字节整数;它们可以通过声明获得。错误消息“error:Integer对于其在(1)处的种类来说太大”告诉您常量9223372036854775807对于其种类来说太大。解决这个问题不需要将默认的整数类型设为8字节,您可以指定常量的类型。@M.S.B:谢谢您的解释。如何指定常量类型?常量的类型由下划线后跟种类值指定:9223372036854775807_KindValue。最好使用内在的selected_int_kind(对于整数,或selected_real_kind(对于reals))来定义整数/参数“variable”KindValue(请参阅此问题的答案),而不是依赖特定的数值,例如8,它在编译器之间的含义可能不同。