gpt4 book ai didi

c# Math.Sqrt 实现

转载 作者:可可西里 更新时间:2023-11-01 08:55:25 24 4
gpt4 key购买 nike

最近我一直在大量使用 System.Math,前几天我想知道 Microsoft 将如何在库中实现 Sqrt 方法。所以我打开我最好的伙伴 Reflector 并尝试 Disassemble 库中的方法,但它显示:

[MethodImpl(MethodImplOptions.InternalCall),ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern double Sqrt(double d);

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

开个玩笑,但我想知道 MS 会使用哪种算法来实现此方法,或者换句话说,如果没有库支持,您将如何在 C# 中编写自己的 Math.Sqrt 实现。

最佳答案

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

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

FCIMPL1_V(double, COMDouble::Sqrt, double d)
WRAPPER_CONTRACT;
STATIC_CONTRACT_SO_TOLERANT;

return (double) sqrt(d);
FCIMPLEND

它只是调用 CRT 函数。但这不是 x86 抖动中发生的情况,请注意表声明中的“内在”。你不会发现在抖动的SSLI20版本中,它是一个简单的不受专利阻碍的。然而,运输确实把它变成了一个内在的:

double d = 2.0;
Console.WriteLine(Math.Sqrt(d));

翻译成

00000008  fld         dword ptr ds:[0072156Ch] 
0000000e fsqrt
..etc

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

关于c# Math.Sqrt 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4931853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com