Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/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
Fortran 在参数中使用交替符号进行求和_Fortran_Fortran90 - Fatal编程技术网

Fortran 在参数中使用交替符号进行求和

Fortran 在参数中使用交替符号进行求和,fortran,fortran90,Fortran,Fortran90,我正在用Fortran 90做一些数字练习。当我试着用交替符号进行求和时,我注意到(以我这样做的方式)Fortran不知道怎么做 例如,我想对k进行一个从1到10的求和(-1)^k)/2k,所以我所做的是 sumk = 0 do k = 1,10 sumk = ((-1)**k)/(2*k) + sumk end do 但是输出是sumk=1。我做错了什么?如果k是整数,则执行整数运算。这些可能不会达到您预期的效果,例如1/2=0。当然,使用浮点数将导致0.5,但转换为整数将导致0 因此

我正在用Fortran 90做一些数字练习。当我试着用交替符号进行求和时,我注意到(以我这样做的方式)Fortran不知道怎么做

例如,我想对k进行一个从1到10的求和(-1)^k)/2k,所以我所做的是

sumk = 0
do k = 1,10
   sumk = ((-1)**k)/(2*k) + sumk
end do

但是输出是sumk=1。我做错了什么?

如果
k
是整数,则执行整数运算。这些可能不会达到您预期的效果,例如
1/2=0
。当然,使用浮点数将导致
0.5
,但转换为整数将导致
0

因此,基本上,在您的情况下,添加到
sumk
的部分始终为零,最终导致
sumk=0
。要防止出现这种情况,需要使用浮点数获取商:

  sumk = real(((-1)**k))/real(2*k) + sumk
然后,结果是
-0.322817445
(我使用Wolfram Alpha进行了验证)



当然,有几种方法可以改进这一点,例如迭代计算
(-1)**k
,或者用模运算代替它

我在Fortran中的最佳经验是,在使用变量时,总是按照您希望在代码中使用的方式声明数字。 当您要使用双用
1.0d0
时,当您要使用单用
1.0e0
时,以及当您要使用整数时,请使用
1
。 因此,对于你的情况,我建议如下:

sumk = 0.0d0
do k = 1,10
   sumk = ((-1.0d0)**dble(k))/(2.0d0*dble(k)) + sumk
end do

顺便说一句,如果你没有任何内存问题,我总是使用双精度。

我总是得到
sumk=0
,请看我的答案。。。那是打字错误吗?你的意思是
(-1)^k
还是
(-i)^k
(虚单位)?我的意思是(-1)^k,打字错误。Sorry做sumk=real((-1)**k)/(2*k))+sumk是一样的吗?不,首先做整数运算,计算0,然后将其转换为real 0.0。但是我想你可以这样做:
sumk=(-1)**k/(2.0*k)
2.0
real
,所以
(2.0*k)
real
,所以整个分数是
real
。如果我可以用整数来做浮点指数的幂,我永远不会用浮点指数来做幂。标准中甚至对此有特殊处理!我同意别人的看法。此外,如果严格执行,则无需对代码进行卷积
(-1.d0)**k)/(2*k)
就足够了。至于是否始终使用双精度,请使用工作精度类常量,并根据需要进行设置。单精度的代码可以快得多。@AlexanderVogt我提到过一个特殊的例外情况;)我同意加快代码的速度,单精度可能是有利的,但如果由于舍入误差而快速得到错误的结果,则情况并非如此。与所有情况一样,最佳解决方案取决于代码。当然,在上面显示的代码中,单精度更好,我同意。