我一直在尋找ATAN2的反射板的.NET實現,發現下面一行:Atan2在.NET中如何實現?
public static extern double Atan2(double y, double x);
,由於它是有道理的,在本機代碼實現最算術功能也就不足爲奇了。但是,在System.Math中沒有與此或其他函數關聯的DllImport調用。
的核心問題是如何在本機代碼實現的功能,但我也想知道它駐留在本地的DLL。另外,爲什麼沒有的DllImport?那是因爲編譯剝離了它嗎?
我一直在尋找ATAN2的反射板的.NET實現,發現下面一行:Atan2在.NET中如何實現?
public static extern double Atan2(double y, double x);
,由於它是有道理的,在本機代碼實現最算術功能也就不足爲奇了。但是,在System.Math中沒有與此或其他函數關聯的DllImport調用。
的核心問題是如何在本機代碼實現的功能,但我也想知道它駐留在本地的DLL。另外,爲什麼沒有的DllImport?那是因爲編譯剝離了它嗎?
看着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
謝謝你的鏈接以及源代碼。 –
有一點要補充,該文件指向COMMON.H指向MATH.H 從MS CPP實現基本上它的調用ATAN2。 – Mataniko
是的,我明白了,因此將答案標記爲正確。再次感謝。 –
ATAN2是圍繞着實際的數學函數ATAN碼包裝的只是一個快速的位(用於gamedev和其他一些隨機編程的情況。)它可能只是直接定義
,然後使用ATAN代碼外部。
好ATAN2介紹各地象限一些邏輯等,這將使用ATAN內部,但我希望看到的邏輯MS會實現它。 –
+1還看到:http://stackoverflow.com/questions/4162232/ATAN2-在-C-尖銳或相似-lanaguge –
毫無的DllImport因爲該方法使用了'MethodImp(MethodImplOptions.InternalCall)]'屬性(它用於被稱爲d本地代碼直接通過CLR方法)。這是CLR的一個特殊屬性。還看到漢斯帕桑特這樣的回答:http://stackoverflow.com/a/8870593/106159 –