为什么C#的十进制使用二进制整数有效位?
Why does C#'s decimal use binary integer significand?
新的 IEEE 128 位十进制浮点类型 https://en.wikipedia.org/wiki/Decimal128_floating-point_format 指定有效数(尾数)可以用两种方式之一表示,可以是简单的二进制整数,也可以是密集的十进制 (在这种情况下,每十位代表三个十进制数字)。
C# 的 decimal
类型早于此标准,但具有相同的想法。它带有二进制整数有效位。
从表面上看,这似乎效率低下;对于加法和减法,要排列有效数,您必须将其中一个除以十的幂;除法是所有算术运算符中最昂贵的。
选择的原因是什么?什么相应的优势被认为值得惩罚?
选择一种表示几乎总是要权衡取舍。
来自here
A binary encoding is inherently less efficient for conversions to or
from decimal-encoded data, such as strings (ASCII, Unicode, etc.) and
BCD. A binary encoding is therefore best chosen only when the data are
binary rather than decimal. IBM has published some unverified
performance data.
Here您可以找到更多关于相对性能的信息。
基本上,它断言了您的想法,小数位通常更快,但大多数运算显示出相似的性能,二进制甚至在除法中获胜。另请记住,由于英特尔似乎主要依赖二进制有效值(我找不到有关其他制造商的提示),因此他们更有可能获得硬件支持,并且可能大大超过小数。
新的 IEEE 128 位十进制浮点类型 https://en.wikipedia.org/wiki/Decimal128_floating-point_format 指定有效数(尾数)可以用两种方式之一表示,可以是简单的二进制整数,也可以是密集的十进制 (在这种情况下,每十位代表三个十进制数字)。
C# 的 decimal
类型早于此标准,但具有相同的想法。它带有二进制整数有效位。
从表面上看,这似乎效率低下;对于加法和减法,要排列有效数,您必须将其中一个除以十的幂;除法是所有算术运算符中最昂贵的。
选择的原因是什么?什么相应的优势被认为值得惩罚?
选择一种表示几乎总是要权衡取舍。
来自here
A binary encoding is inherently less efficient for conversions to or from decimal-encoded data, such as strings (ASCII, Unicode, etc.) and BCD. A binary encoding is therefore best chosen only when the data are binary rather than decimal. IBM has published some unverified performance data.
Here您可以找到更多关于相对性能的信息。
基本上,它断言了您的想法,小数位通常更快,但大多数运算显示出相似的性能,二进制甚至在除法中获胜。另请记住,由于英特尔似乎主要依赖二进制有效值(我找不到有关其他制造商的提示),因此他们更有可能获得硬件支持,并且可能大大超过小数。