【问题标题】:Why does C#'s decimal use binary integer significand?为什么C#的十进制使用二进制整数有效位?
【发布时间】:2020-10-31 20:43:08
【问题描述】:

新的 IEEE 128 位十进制浮点类型 https://en.wikipedia.org/wiki/Decimal128_floating-point_format 指定有效数(尾数)可以用两种方式之一表示,可以是简单的二进制整数,也可以是密集的十进制(在这种情况下,每个十位代表三位十进制数字)。

C# 的decimal 类型早于该标准,但具有相同的想法。它带有二进制整数有效位。

从表面上看,这似乎效率低下;对于加法和减法,要排列有效数字,您必须将其中一个除以十的幂;除法是所有算术运算符中最昂贵的。

选择的原因是什么?什么相应的优势被认为值得惩罚?

【问题讨论】:

  • “因为这是写的”? .NET 1 于 2002 年初发布;可能有特定的技术 r 可供选择,或者可能完全是“什么符合预期的行为并且我们可以按时发货?” - 但是:希望在这一点上找到全部原因可能是雄心勃勃的
  • 因为这是英特尔在微处理器中的浮点单元中使用的。请参阅:software.intel.com/content/www/us/en/develop/articles/…
  • @jdweng 该链接讨论了一个软件浮点库。我没有在其中看到任何表明十进制浮点是在今天的英特尔 CPU 上的硬件中实现的,更不用说在发明 C# 的时候了?
  • 您认为英特尔在哪里使用该库?请参阅:intel.com/content/dam/www/public/us/en/documents/case-studies/…
  • @jdweng Intel 处理器上的浮点单元是二进制而不是十进制

标签: c# .net floating-point decimal 128-bit


【解决方案1】:

选择一种表示法几乎总是需要权衡取舍。

来自here

二进制编码在转换为或 来自十进制编码的数据,例如字符串(ASCII、Unicode 等)和 BCD。因此,只有当数据是 二进制而不是十进制。 IBM 发布了一些未经验证的 性能数据。

Here你可以找到更多关于相对性能的信息。

基本上,它肯定了您的想法,小数位通常更快,但大多数运算显示出相似的性能,二进制甚至在除法中获胜。还要记住,由于英特尔似乎主要依赖于二进制显着性(我找不到有关其他制造商的提示),因此它们更有可能获得硬件支持,并且可能比小数有很大优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 2017-08-22
    • 1970-01-01
    • 2019-03-04
    • 2013-08-29
    • 2016-02-14
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多