首页 > 解决方案 > 为什么C#的十进制类型是128位?

问题描述

decimal选择 C# 的类型为 128 位是否有原因?类比double会建议 64 位(仅十进制浮点而不是二进制),而与 Java 类比,或“确保它拥有所需的一切”的哲学,会建议任意精度。

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

标签: c#floating-pointdecimalprecision128-bit

解决方案


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 系统上)。

英特尔® 64 和 IA-32 架构软件开发人员手册


推荐阅读