2013-06-26 4 views
5

Ich wurde für die .NET-Implementierung von Atan2 in einem Reflektor suchen und finden Sie die folgende Zeile:Wie ist Atan2 in .NET implementiert?

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

Das ist nicht überraschend, da es Sinn macht für die meisten arithmetischen Funktionen in nativen Code implementiert werden. Es war jedoch kein DllImport-Aufruf mit dieser oder anderen Funktionen in System.Math verknüpft.

Die Kernfrage ist, wie die Funktion in nativem Code implementiert ist, aber ich möchte auch wissen, in welcher nativen DLL es sich befindet. Warum gibt es auch keinen DllImport? Ist das so, weil die Compilation es wegstreift?

+0

+1 siehe auch: http://stackoverflow.com/questions/4162232/atan2-in-c-sharp- oder -ähnliche-lanaguge –

+0

Es gibt kein DllImport, da die Methode das 'MethodImp (MethodImplOptions.InternalCall)]' Attribut verwendet (das für systemeigenen Code verwandt wird, der D genannt wird) direkt nach CLR-Methoden). Dies ist ein spezielles Attribut nur für die CLR. Siehe auch diese Antwort von Hans Passant: http://StackOverflow.com/a/8870593/106159 –

Antwort

1

Wenn Sie Math.cs betrachten, werden Sie bemerken, dass Atan2 direkt als interner Anruf implementiert wird.

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

Das sagt im Grunde .NET eine zugrunde liegende C++ Funktion aufzurufen.

Weitere Informationen unter: Is it possible to link a method marked with MethodImplOptions.InternalCall to its implementation?

Download unter: http://www.microsoft.com/en-us/download/details.aspx?id=4917

von 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

Vielen Dank für die Links sowie den Quellcode. –

+0

Eine Sache hinzuzufügen, Diese Datei verweist auf common.h, die auf math.h zeigt Grundsätzlich ruft es Atan2 von MS cpp-Implementierung. – Mataniko

+0

Ja, ich bin dazu gekommen und habe damit die Antwort als richtig markiert. Danke noch einmal. –

0

Atan2 ist nur ein kurzes Stück Code umschlingenden die tatsächliche mathematische Funktion Atan (Nützlich für gamedev und eine paar andere zufällige Programmierung Situation.)

Es ist wahrscheinlich nur direkt definiert und dann der Atan Code verwendet es ist extern.

+0

Nun Atan2 führt einige Logik um Quadranten usw. ein. Es würde Atan intern verwenden, aber ich war daran interessiert, die Logik zu sehen, die MS implementiert hätte es. –

Verwandte Themen