我在实际的Math.Ceiling
函数中进行了调查,该函数背后的算法是如何在.net框架中实现的。
我已经使用mscorlib.dll中的反编译器检查了函数Math.Ceiling
,但它似乎是由本机代码实现的:
我怎样才能知道Ceiling函数使用的算法是什么样的?
答案 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。