【问题标题】:Why is C#'s decimal type 128 bits?为什么C#的十进制类型是128位?
【发布时间】:2020-10-31 20:31:04
【问题描述】:

C# 的decimal 类型选择为 128 位有什么原因吗?与double 类比会建议使用 64 位(仅十进制浮点而不是二进制),而与 Java 类比,或者“确保它有任何需要”的哲学,会建议任意精度。

这不是一个反问句。我个人会以任意精度进行,但 128 位可能工作正常。我只是在问,选择的实际原因是否已经记录在任何地方,或者是否合理猜测;它是针对特定用例还是由直觉决定的;是否存在 64 位不够但不需要任意精度的已知用例?

【问题讨论】:

  • 它已经写得很详细了,但我手头没有链接。使用 128 的一些原因可能包括避免使用过多的不同精度的十进制类型,希望能够利用 128 位寻址来提高相对性能。

标签: c# floating-point decimal precision 128-bit


【解决方案1】:

Decimal 允许拥有比 double(8 字节 = 64 位)更高的容量来存储实数,但小于 BigInteger(不是操作实数的数据类型)。

我们的计算机科学基于微处理器架构,CPU 实际上管理最多 64 位寄存器以处理内部数据和内存。

过去,特定芯片组的 CPU 寄存器可以是 8、16、32 或 64 位甚至 128 位。

因此实际上,64位CPU的通常操作和优化等于8字节。

x64 CPU 在使用 8 字节寄存器获取/设置内存单元、计算、执行连续测试、调用过程、返回 proc、执行堆栈推送和弹出等操作时,以最佳容量和速度运行。

所以为了对超过 8 个字节的数字进行最快的计算,最好的选择是使用两个 64 位寄存器,因此 128 位等于 8 + 8 个字节。

认为是一条路:32bits是小路,64bits是标准路,128bits是大路:在x64系统上使用32bits需要限制路,使用128bits访问需要独占2条路.

但为了获得最佳优化,并且由于电子制造,在我们的 CPU 架构中,每件事都是 8 位的倍数,因此是 1/2/4/8/16/32/64/128/256...字节。因为硬件以及构造函数如何做事。因为二元算术理论。

因此,在 64 位上拥有大实数的第一个最佳可能性是使用 128 位,即两个 64 位的 CPU 寄存器(在 x64 系统上)。

Intel® 64 and IA-32 Architectures Software Developer Manuals

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 2014-05-30
    • 2019-11-29
    • 2020-10-31
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多