2013-06-26 75 views
5

我一直在尋找ATAN2的反射板的.NET實現,發現下面一行:Atan2在.NET中如何實現?

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

,由於它是有道理的,在本機代碼實現最算術功能也就不足爲奇了。但是,在System.Math中沒有與此或其他函數關聯的DllImport調用。

的核心問題是如何在本機代碼實現的功能,但我也想知道它駐留在本地的DLL。另外,爲什麼沒有的DllImport?那是因爲編譯剝離了它嗎?

+0

+1還看到:http://stackoverflow.com/questions/4162232/ATAN2-在-C-尖銳或相似-lanaguge –

+0

毫無的DllImport因爲該方法使用了'MethodImp(MethodImplOptions.InternalCall)]'屬性(它用於被稱爲d本地代碼直接通過CLR方法)。這是CLR的一個特殊屬性。還看到漢斯帕桑特這樣的回答:http://stackoverflow.com/a/8870593/106159 –

回答

1

看着Math.cs你會發現,ATAN2直接實現內部通話。

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

這基本上告訴.NET調用底層的C++函數。

更多信息請訪問: Is it possible to link a method marked with MethodImplOptions.InternalCall to its implementation?

下載: 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 
+0

謝謝你的鏈接以及源代碼。 –

+0

有一點要補充,該文件指向COMMON.H指向MATH.H 從MS CPP實現基本上它的調用ATAN2。 – Mataniko

+0

是的,我明白了,因此將答案標記爲正確。再次感謝。 –

0

ATAN2是圍繞着實際的數學函數ATAN碼包裝的只是一個快速的位(用於gamedev和其他一些隨機編程的情況。)它可能只是直接定義

,然後使用ATAN代碼外部。

+0

好ATAN2介紹各地象限一些邏輯等,這將使用ATAN內部,但我希望看到的邏輯MS會實現它。 –