C# 如何在.NET中实现Atan2?

C# 如何在.NET中实现Atan2?,c#,.net,math,C#,.net,Math,我在一个反射器中寻找Atan2的.NET实现,发现了以下行: public static extern double Atan2(double y, double x); 这并不奇怪,因为在本机代码中实现大多数算术函数是有意义的。但是,System.Math中没有与此函数或其他函数关联的DllImport调用 核心问题是函数如何在本机代码中实现,但我也想知道它驻留在哪个本机Dll中。还有,为什么没有DllImport?这是因为编译将其剥离掉了吗?Atan2只是一段围绕实际数学函数Atan的快速

我在一个反射器中寻找Atan2的.NET实现,发现了以下行:

public static extern double Atan2(double y, double x);
这并不奇怪,因为在本机代码中实现大多数算术函数是有意义的。但是,System.Math中没有与此函数或其他函数关联的DllImport调用


核心问题是函数如何在本机代码中实现,但我也想知道它驻留在哪个本机Dll中。还有,为什么没有DllImport?这是因为编译将其剥离掉了吗?

Atan2只是一段围绕实际数学函数Atan的快速代码(对于gamedev和其他一些随机编程情况很有用)


它可能只是直接定义的,然后它使用的Atan代码是外部的。

查看Math.cs,您会注意到Atan2是作为内部调用直接实现的

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

这基本上告诉.NET调用一个底层C++函数。 更多信息,请访问:

下载地址:

从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

Atan2引入了一些围绕象限的逻辑,等等。它会在内部使用Atan,但我感兴趣的是看到MS实现它的逻辑。+1另请参见:没有DllImport,因为该方法使用
methodImpl(MethodImplOptions.InternalCall)]
属性(用于CLR方法直接调用的本机代码)。这只是CLR的一个特殊属性。另请参见Hans Passant的回答:需要添加的一件事是,此文件指向common.h,它指向math.h,基本上它是从MS cpp实现调用atan2。是的,我找到了,因此将答案标记为正确。再次感谢。