首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c# Math.Sqrt实现

c# Math.Sqrt实现
EN

Stack Overflow用户
提问于 2011-02-08 18:25:00
回答 5查看 10.6K关注 0票数 11

我最近一直在使用System.Math,有一天我在想,微软会如何在库中实现Sqrt方法。所以我打开我最好的伙伴Reflector,并试图在库中反汇编该方法,但它显示:

代码语言:javascript
复制
[MethodImpl(MethodImplOptions.InternalCall),ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern double Sqrt(double d);

那一天,我第一次意识到我的孩子们是多么依赖框架,吃东西。

别开玩笑了,但我想知道MS会使用哪种算法来实现这种方法,换句话说,如果你没有库支持,你如何用C#编写你自己的Math.Sqrt实现。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-08 18:56:43

任何使用Reflector或Reference Source返回的具有MethodImplOptions.InternalCall属性的方法实际上都是在CLR内的C++中实现的。您可以从SSCLI20发行版获得这些应用程序的源代码。相关文件是clr/src/vm/ecall.cpp,它包含一个带有函数指针的方法名表,JIT编译器使用该表将调用地址直接嵌入到生成的机器码中。相关的表节是

代码语言:javascript
复制
FCIntrinsic("Cos", COMDouble::Cos, CORINFO_INTRINSIC_Cos)
FCIntrinsic("Sqrt", COMDouble::Sqrt, CORINFO_INTRINSIC_Sqrt)
FCIntrinsic("Round", COMDouble::Round, CORINFO_INTRINSIC_Round)
...

这会将您带到clr/src/classlibnative/float/comfloat.cpp at.cpp

代码语言:javascript
复制
FCIMPL1_V(double, COMDouble::Sqrt, double d)
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

    return (double) sqrt(d);
FCIMPLEND

它只调用CRT函数。但这不是在x86抖动中发生的,请注意表声明中的“内在”。你不会发现在SSLI20版本的抖动中,它是一个不受专利限制的简单版本。不过,发货时确实会将其转换为内部函数:

代码语言:javascript
复制
double d = 2.0;
Console.WriteLine(Math.Sqrt(d));

翻译为

代码语言:javascript
复制
00000008  fld         dword ptr ds:[0072156Ch] 
0000000e  fsqrt 
..etc

换句话说,Math.Sqrt()转换成单个浮点机器代码指令。有关如何轻松击败本机代码的详细信息,请查看this answer

票数 19
EN

Stack Overflow用户

发布于 2011-02-08 18:32:07

该函数将被翻译成汇编指令。例如x87的fsqrt指令。

您可以在软件中实现浮点数,但这很可能要慢得多。我认为对于Sqrt来说,迭代算法是典型的实现。

票数 4
EN

Stack Overflow用户

发布于 2011-02-08 18:34:32

与StackOverflow.com相比,Google.com将为您提供更多答案

看看这个页面:http://en.wikipedia.org/wiki/Methods_of_computing_square_roots One算法可以在上面的维基页面的标题“二进制数字系统(基数2)”下找到。

但是,软件实现将不会是有效的。现代CPU在FPU中有数学函数的硬件实现。你只需要调用处理器的正确指令(用汇编语言或机器语言)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4931853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档