c# - 为什么C#的十进制类型是128位?
问题描述
decimal
选择 C# 的类型为 128 位是否有原因?类比double
会建议 64 位(仅十进制浮点而不是二进制),而与 Java 类比,或“确保它拥有所需的一切”的哲学,会建议任意精度。
这不是一个修辞问题。我个人会以任意精度进行,但 128 位可能工作正常。我只是在问,选择的实际原因是否已经记录在任何地方,或者是否合理猜测;它是针对特定用例还是由直觉决定的;是否存在 64 位不够但不需要任意精度的已知用例?
解决方案
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 系统上)。
推荐阅读
- sql - PostgreSQL 中的 JSON 和 regex_replace
- java - 在 Android 中授予权限后打开文件选择器
- filenet-p8 - 禁用 ContextMenu - IBM Content Navigator
- javascript - 试图让 HTML Radio 触发显示图像的功能
- python - 有什么方法可以在不使用私有函数的情况下将 pandas DataFrame itertuples 对象转换为字典?
- git - 当远程仓库发生变化时自动同步本地仓库
- boto - 使用 s3fs 将 sklearn 模型上传到 S3 存储桶时出现问题
- java - 无法为 Apache Commons-csv 添加 Maven 依赖项
- spring-boot - 为什么 CascadeType.MERGE、CascadeType.PERSIST 无助于获取内部数据
- javascript - 使用 javascript 中的此选择器从很多特定对象中制作动画