Atan2如何在.NET中实现?

时间:2013-06-26 05:29:13

标签: c# .net math

我在反射器中寻找Atan2的.NET实现,并找到以下行:

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

这并不奇怪,因为大多数算术函数都可以在本机代码中实现。但是,没有与System.Math中的此函数或其他函数关联的DllImport调用。

核心问题是如何在本机代码中实现该功能,但我也想知道它所在的原生Dll。另外,为什么没有DllImport?这是因为编辑将它剥离了吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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