Math.Ceiling方法

时间:2016-01-21 15:14:59

标签: c# algorithm math ceiling

我在实际的Math.Ceiling函数中进行了调查,该函数背后的算法是如何在.net框架中实现的。 我已经使用mscorlib.dll中的反编译器检查了函数Math.Ceiling,但它似乎是由本机代码实现的:

enter image description here

我怎样才能知道Ceiling函数使用的算法是什么样的?

1 个答案:

答案 0 :(得分:4)

是双号,是external code

[System.Security.SecuritySafeCritical]  // auto-generated
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern double Ceiling(double a); 

这意味着该方法实际上是在用C ++编写的CLR中实现的。查找表位于clr/src/vm/ecalllist.h。与Math.Ceiling()相关的部分如下所示:

FCFuncStart(gMathFuncs)
  ...
  FCFuncElement("Log10", COMDouble::Log10)
  FCFuncElement("Ceiling", COMDouble::Ceil)
  FCFuncElement("SplitFractionDouble", COMDouble::ModFDouble)
  ...

CLR实现调用本机函数:

FCIMPL1_V(double, COMDouble::Ceil, double d) 
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

    return (double) ceil(d);
FCIMPLEND

Here is来自<cmath>的实施:

#include <cmath>
#include <cfenv>
#pragma STDC FENV_ACCESS ON
double ceil(double x)
{
    double result;
    int save_round = std::fegetround();
    std::fesetround(FE_UPWARD);
    result = std::rint(x); // or std::nearbyint 
    std::fesetround(save_round);
    return result;
}

有关详细信息,另请参阅Hans answer