5

リフレクターで Atan2 の .NET 実装を探していたところ、次の行が見つかりました。

public static extern double Atan2(double y, double x);

ほとんどの算術関数がネイティブ コードで実装されることは理にかなっているため、これは驚くべきことではありません。ただし、System.Math のこの関数または他の関数に関連付けられた DllImport 呼び出しはありませんでした。

中心的な質問は、関数がネイティブ コードでどのように実装されているかについてですが、それがどのネイティブ Dll に存在するかも知りたいです。また、DllImport がないのはなぜですか? それはコンパイルがそれを取り除くからですか?

4

2 に答える 2

1

Math.cs を見ると、Atan2 が内部呼び出しとして直接実装されていることがわかります。

[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern double Atan2(double y, double x);

これは基本的に、基になる C++ 関数を呼び出すように .NET に指示します。

詳細については、次を参照してください: MethodImplOptions.InternalCall でマークされたメソッドをその実装にリンクすることは可能ですか?

ダウンロード: http://www.microsoft.com/en-us/download/details.aspx?id=4917

comfloat.cpp から:

/*=====================================Atan2=====================================
**
==============================================================================*/
FCIMPL2_VV(double, COMDouble::Atan2, double x, double y) 
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

        // the intrinsic for Atan2 does not produce Nan for Atan2(+-inf,+-inf)
    if (IS_DBL_INFINITY(x) && IS_DBL_INFINITY(y)) {
        return(x / y);      // create a NaN
    }
    return (double) atan2(x, y);
FCIMPLEND
于 2013-06-26T06:21:08.213 に答える