MODULE fractions
real*8, parameter:: one_over_three = 1.d0/3.d0
real*8, parameter:: eleven_over_eighteen = 11.d0/18.d0
real*8, parameter:: five_over_64 = 5.d0/64.d0
real*8, parameter:: five_over_eight = 5.d0/8.d0
real*8, parameter:: five_over_sixteen = 5.d0/16.d0
real*8, parameter:: fiveteen_over_eight = 15.d0/8.d0
real*8, parameter:: fiveteen_over_four = 15.d0/4.d0
real*8, parameter:: fiveteen_over_two = 15.d0/2.d0
real*8, parameter:: fortyfive_over_eight = 45.d0/8.d0
real*8, parameter:: nine_over_two = 9.d0/2.d0
real*8, parameter:: one_over_eight = 1.d0/8.d0
real*8, parameter:: three_over_eight = 3.d0/8.d0
real*8, parameter:: three_over_two = 3.d0/2.d0
real*8, parameter:: two_over_three = 2.d0/3.d0
real*8, parameter:: eight_over_three = 8.d0/3.d0
real*8, parameter:: seven_over_two = 7.d0/2.d0
END MODULE fractions
在我的 Fortran 程序中,我必须多次调用同一个子例程。它涉及几个分数。如果我使用上述模块或让程序在调用子例程并使用该模块时执行分数计算,是否会提高子例程的性能?
最佳答案
在优化编译器时这并不重要。这些分数无论出现在哪里都会被预先计算。无论您是编写 two_over_two
还是 3.d0/2.d0
或者直接说 3/2d0
,性能都应该是相同的。
就我个人而言,我不会打扰这样的模块,它会影响可读性。这是个体的,局部常量通常可能有利于可读性。但我会将其保留在本地(而不是在常量的专用模块中),并且我会根据常量的用途而不是根据其值来命名常量。
注释显示了一个潜在问题,可能需要一对括号,即 x*3./2.
实际上意味着 (x*3.)/2.
。我个人倾向于将这些因素放在表达式的开头,因此这不是一个问题,但最好考虑到这一点。
关于performance - Fortran 模块性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62173962/