编程语言
首页 > 编程语言> > c# – Math.Ceiling方法

c# – Math.Ceiling方法

作者:互联网

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

enter image description here

我怎样才能知道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