C#中针对自己库的数学库

时间:2013-09-18 11:09:32

标签: c# math

所以我们尝试在C#中开发数学课,我们做到了。 将结果与System.Math的原始数学类进行比较表明,我们总是迟到一点或很多(特别是trig方法)。

但是当我们使用像Absolut这样的基本方法时,我们就会感到奇怪,除了

之外不包含大量代码
if(value < 0) return -value;
else return value;

但我们仍远远落后。

我无法使这个abs方法更小,使用三元运算符也无济于事。

是因为System.Math会用C编写吗? 如果我们用母语写它会更快,虽然它看起来不会改变太多我读。 最后,一个DLL可以比一个类更快地工作,如果是这样,为什么,如果不是......那么为什么呢?

谢谢。

2 个答案:

答案 0 :(得分:3)

继续显示CLR的Servé's comment是用C ++编写的,您会发现Math.Abs调用fabs or fabsf

FCIntrinsicSig("Abs", &gsig_SM_Flt_RetFlt, COMDouble::AbsFlt, CORINFO_INTRINSIC_Abs)
FCIntrinsicSig("Abs", &gsig_SM_Dbl_RetDbl, COMDouble::AbsDbl, CORINFO_INTRINSIC_Abs)
/*=====================================AbsFlt=====================================
**
==============================================================================*/
FCIMPL1_V(float, COMDouble::AbsFlt, float f) 
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

    FCUnique(0x14);
    return fabsf(f);
FCIMPLEND

/*=====================================AbsDbl=====================================
**
==============================================================================*/
FCIMPL1_V(double, COMDouble::AbsDbl, double d) 
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

    return fabs(d);
FCIMPLEND

答案 1 :(得分:0)

我不认为System.Math中的普通函数是用C语言编写的,因为调用C的开销在很多情况下会太高。也许它们是用原始IL编写的,以使它们更快。

顺便说一句:你为​​什么要写自己的数学库?这几乎不是一个好主意。