【问题标题】:Fortran DMOD vs Python numpy.remainder [duplicate]Fortran DMOD vs Python numpy.remainder [重复]
【发布时间】:2020-11-27 05:17:00
【问题描述】:

为什么在 Fortran 中使用“DMOD”和在 Python 中使用“numpy.remainder”会得到不同的结果?

在 Fortran 中:

DOUBLE PRECISION aaa,bbb
aaa = 2.11561
bbb = 1.19841
out = DMOD(aaa, bbb)
print*,out

我得到:0.917199850

在python中:

import numpy as np
print(np.remainder(2.11561,1.19841))

我得到:0.9172000000000002

【问题讨论】:

  • 您的 Fortran 常量是单精度的。双精度常量有不同的语法,例如1.2D9D 表示双精度)。
  • 自 1977 年语言中出现新的内部函数重载以来,dmod 也不是过时的。只需使用 Mod( aaa, bbb )
  • 你必须将out添加到声明为double precision的变量列表中:DOUBLE PRECISION aaa,bbb,out
  • 您的变量out 隐含为real,这会导致结果转换为单精度。要保留完整的双精度结果,您需要将out 声明为double。这可能是剩余差异的原因。
  • IMPLICIT NONE 是你的朋友......永远!

标签: python numpy fortran mod


【解决方案1】:

如果你想在 Fortran 中实现双精度,你也需要这样写常量。你可以这样做,通过使用_dp 后缀:

integer, parameter:: dp=kind(0.d0)
aaa = 2.11561_dp

或者您可以在号码中使用d

aaa = 2.11561d0

e 用于单精度,d 用于双精度。单精度是默认的……即使变量是双精度的,常量也可能是单精度的!在 C 语言中也是如此。

区别在于Python和C默认使用双精度,你必须要求单精度。

【讨论】:

  • 谢谢,如果我使用 D(aaa = 2.11561D0,等等 bbb),我会得到更接近但不完美的 0.917200029
  • @scana: 可能是因为out 是单精度的。
  • 更好的 imo 是 use iso_fortran_env, only: RK => real64; real(RK) :: aaa = 2.11561_RK
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2013-10-16
  • 2019-11-10
  • 2019-04-06
相关资源
最近更新 更多