c# – Math.Ceiling方法
作者:互联网
我在实际的Math.Ceiling函数中得到了强调,该函数背后的算法是如何在.net框架中实现的.
我在mscorlib.dll中使用反编译器检查了函数Math.Ceiling,但它似乎是由本机代码实现的:
我怎样才能知道Ceiling函数使用的算法是什么样的?
解决方法:
对于双数字是的,它实际上是external code:
[System.Security.SecuritySafeCritical] // auto-generated
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern double Ceiling(double a);
这意味着该方法实际上是在CLR中实现的,用C语言编写.查找表位于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.
标签:c,algorithm,math,ceiling 来源: https://codeday.me/bug/20190623/1270562.html