【问题标题】:Integer precision [duplicate]整数精度[重复]
【发布时间】:2018-02-18 15:20:20
【问题描述】:

我正在使用 Fortran 解决 Project Euler 问题;问题是创建一个斐波那契数列并找到所有小于 400 万的偶数的总和。这是我写的

implicit none
integer*4::a(1:4000000),sum
integer*4::i,maxc
maxc = 3999999

a(1) = 1
a(2) = 2
do i = 3,maxc,1
   a(i) = a(i-1) + a(i-2)
end do
sum = 0
do i = 1,maxc
   if (mod(a(i),2)==0) then
      sum = sum + a(i)
   end if
end do
print*,sum


end

输出为-1833689714 知道出了什么问题吗?

【问题讨论】:

  • 另外,请注意,使用 integer*4 在编译器中的定义并不明确。详情请见here

标签: fortran gfortran


【解决方案1】:

由于您选择的整数类型的大小,您可以表示的数字是有限的。 在您的代码中,它是2147483647(带有gfortran,由print *,huge(sum) 获得)。 可以证明,在您的实现中,i=59 超出了此限制。 然后,您会得到一个整数溢出,并且该值变为负数。

简单地使用浮点表示求和,即

real :: sum

成功了。

【讨论】:

  • 双精度不是更好吗?
  • @albert:在这种情况下,结果足够小以适合单精度浮点数的范围。有人可能会争辩说,精度可能会有所不同……我试过了,但结果是一样的。
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2018-08-09
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多