2008-10-29 60 views
1

FORTRAN提供了幾個函數來將雙精度數轉換爲整數值。用於截斷/舍入的方法不同。我正在轉換使用這些的複雜科學算法。在C中匹配FORTRAN舍入#

根據FORTRAN文檔:
AINT(x)的返回x和0,最近的X之間的積分值。
anint(x)返回x的最接近的整數值,除了中途情況是 四捨五入到量值較大的整數值。
nint(x)將x轉換爲int格式,舍入爲最接近的int值,除了 中途情況被四捨五入爲整數值的幅度更大。

有沒有人有這些在C#中的實現? 這可能會很棘手。

(int)x似乎與aint()
Convert.ToInt32(x)不符合上述任何一項。
Trunc(x)不符合上述任何一項。
Round(x)可能匹配anint或nint。

anint和nint之間的區別似乎是返回類型,其中anint返回雙精度值,但nint返回整數。兩者都用於(實際樣品):
DOUBLE PRECISION A,B,C,D,E,F,G
...此處設置的值...
F = ANINT(AB)+ ANINT(CD)+ ANINT(B + DE)
G = NINT(F)+ 1D0;
也許FORTRAN專家可以幫助澄清爲什麼作者選擇使用兩者(我假設它是故意的)。

回答

3

從你的話費定義,nintanint通過使用MidpointRounding.AwayFromZeroMath.Round提供。

對於aint,從doubleint有明確的轉換將實現這一結果。

+0

文檔: http://msdn.microsoft.com/en-us/library/system.math.round.aspx 在早期版本的C#中不存在。 – 2008-10-29 16:17:14

+0

謝謝,馬克。在早期的版本中,我並沒有意識到它的缺失。 – 2008-10-29 17:10:33

1

從我所看到的,aint()只是Math.Floor()

對於另外兩個,我認爲你是正確的,唯一的區別是返回類型:nint()返回一個實際整數,而anint()返回恰好具有整數值的double(fortran:real)。

0

我有功能ANINT的實現,按照代碼:這裏

double anint(double x) 
{ 
    int a; 
    double y; 

    a = (int)x; //a=9 

    if (10 * x - 10 * (double)a >= 5) 
    { 
     a = a + 1; 
    } 

    y = (double)a; 

    return y; 
}