2013-06-26 17 views
5

Cercavo l'attuazione .NET di atan2 in un riflettore e ho trovato la seguente riga:Come viene implementato Atan2 in .NET?

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

Questo non è sorprendente dal momento che ha senso per la maggior parte delle funzioni aritmetiche per essere implementate in codice nativo. Tuttavia, non esisteva alcuna chiamata DllImport associata a questa o altre funzioni in System.Math.

La domanda principale riguarda il modo in cui la funzione è implementata nel codice nativo, ma vorrei anche sapere quale Dll nativo risiede. Inoltre, perché non esiste DllImport? È perché la compilazione lo spoglia?

+0

+1 vedi anche: http://stackoverflow.com/questions/4162232/atan2-in-c-sharp-or-similar-lanaguge –

+0

Non esiste DllImport perché il metodo utilizza l'attributo 'MethodImp (MethodImplOptions.InternalCall)]' (che viene utilizzato per il codice nativo chiamato d irectly dai metodi CLR). Questo è un attributo speciale solo per CLR. Vedi anche questa risposta di Hans Passant: http://stackoverflow.com/a/8870593/106159 –

risposta

1

Guardando Math.cs noterete che Atan2 è implementato direttamente come una chiamata interna.

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

Questo in sostanza dice a .NET di chiamare una funzione C++ sottostante.

Maggiori informazioni su: Is it possible to link a method marked with MethodImplOptions.InternalCall to its implementation?

download all'indirizzo: http://www.microsoft.com/en-us/download/details.aspx?id=4917

da 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

Grazie per i collegamenti e il codice sorgente. –

+0

Una cosa da aggiungere, Questo file punta a common.h che punta a matematica.h Fondamentalmente sta chiamando atan2 dall'implementazione di MS cpp. – Mataniko

+0

Sì, ci sono arrivato e ho contrassegnato la risposta come corretta. Grazie ancora. –

0

ATAN2 è solo un po 'veloce di codice di avvolgimento intorno alla funzione matematica attuale Atan (Utile per gamedev e qualche altra situazione di programmazione casuale.)

E' probabile che solo direttamente definito, e quindi il codice Atan che utilizza è esterno.

+0

Bene Atan2 introduce una certa logica sui quadranti, ecc. Userebbe internamente Atan ma ero interessato a vedere la logica che MS avrebbe implementato esso. –

Problemi correlati