Fortran90到C#转换问题

Fortran90到C#转换问题,c#,fortran,fortran90,C#,Fortran,Fortran90,我正在将一些Fortran90代码转换为C#。我对Fortran77有些了解,但对Fortran90不太熟悉。我遇到了下面这行代码,我不知道如何翻译 C1 = real(product((/(-1,i1=1,m-1)/))*product((/(i1,i1=2,m)/))) 我认为这应该转化为: int product1 = -1; int product2 = 1; for (int i1 = 1 ; i1 <= (m-1); i1++) { product1 *= -1; }

我正在将一些Fortran90代码转换为C#。我对Fortran77有些了解,但对Fortran90不太熟悉。我遇到了下面这行代码,我不知道如何翻译

C1 = real(product((/(-1,i1=1,m-1)/))*product((/(i1,i1=2,m)/)))
我认为这应该转化为:

int product1 = -1; int product2 = 1;
for (int i1 = 1 ; i1 <= (m-1); i1++)
{
    product1 *= -1;
}
for (int i2 = 2, i2 <= m; i2++)
{
    product2 *= i2;
}
float C1 = (float)(product1 * product2);
但我从未见过像在所讨论的Fortran语句中那样使用“产品”这个词。我知道向量或矩阵乘法有一个内在函数叫做乘积,但“乘积”在我正在使用的代码中不是数组,而且内在函数乘积的语法使用掩码,所以很明显我的语句没有使用这个函数


如有任何见解或帮助,将不胜感激。谢谢。

如果您分解零件并打印它们,您会注意到这些只是使用简明矢量化术语创建的术语:

! given: (/(expr, start, end)/)
!
! (/(-1, i1=1, m-1)/) = vector, -1 repeated m-1 times
!
! (/(i1, i1=2, m)/)   = vector, 2..m
!
! Both are vectors with m-1 terms
另外需要注意的是,
product()
不需要3个参数。第二个参数(要使用的维度)和第三个参数(数组掩码)不是必需的

此时,第一个产品实际上是
-1
m-1
,第二个产品是
m

因此,适当(但不一定有效)的翻译可以是:

// product((/(-1,i1=1,m-1)/)) => -1^m-1
double i = (m % 2 == 0 ? -1 : 1);

// product((/(i1,i1=2,m)/))   => m!
double mfact = i;
for (int jj = 2; jj < m; ++jj)
{
    mfact *= jj;
} // C1 = mfact;

你可能应该试着理解代码的作用,而不是盲目地翻译它。从数学上来说,上面的是
-cos(π*m)*m
因此第一个产品翻转符号,第二个产品计算
m
的阶乘。在
C#
中,您可以使用
1-2*(m%2)
翻转每个
m
的符号。非常感谢。最后,我使用了ja72对符号翻转[-1+2*(m%2)]的建议,并使用尾部递归计算阶乘。非常感谢大家。
// product((/(-1,i1=1,m-1)/)) => -1^m-1
double i = (m % 2 == 0 ? -1 : 1);

// product((/(i1,i1=2,m)/))   => m!
double mfact = i;
for (int jj = 2; jj < m; ++jj)
{
    mfact *= jj;
} // C1 = mfact;
double i = (m % 2 == 0 ? -1 : 1);
double C1 = Enumerable.Range(2, m)
                      .Aggregate(i, (x, y) => x * y);