系统.Decimal是一致的吗?

4
使用float或double进行浮点计算时,会在硬件上执行,不同的架构或优化设置可能会产生不同的结果,详见此处讨论。
那个主题中简要提到了一个问题,但没有得到充分回答,即System.Decimal的情况。有人指出System.Decimal可以作为一种连续的浮点类型,但速度非常慢,并且.NET提供的数学函数(System.Math)没有为System.Decimal实现。
我能找到的关于这种类型的唯一其他信息是Marc Gravell 它是由软件实现的,这强烈暗示它确实是一致的。
因此,我的问题是:是否可以使用System.Decimal在所有硬件平台上获得一致的结果,或者它容易受到与System.Single和System.Double相同的问题?
如果System.Decimal是一致的,则是否有任何免费库为其实现超越函数(cos、sin、tan、sqrt、log等)?
1个回答

2

在所有.NET实现中产生相同结果的方式是一致的。

它的一致性并不意味着它总是能正确地表示操作的结果。任何浮点数都可能无法准确表示某些值。例如,System.Decimal 只能准确地表示那些可以作为十进制值准确表示的数字。比如,1/3将被不准确地表示为0.33333......,由于任何数字系统(如十进制或二进制)都有很多值只能表示为最近的逼近值,cos、sin、tan、sqrt和log的许多结果将是逼近值。

C#规范说: 对于decimal类型的值进行操作的结果是计算精确结果(保留每个运算符所定义的比例),然后四舍五入以适应表示形式。结果四舍五入为最接近的可表示值,当结果与两个可表示值相等时,四舍五入到最低有效数字位置上有偶数的值。


你能提供任何逻辑解释或权威来源来支持你的说法吗?当然,问题是关于一致性而不是正确性。 - Asik
你写道:“一致的方式将在所有.NET实现上产生相同的结果”,但是这个页面说:“浮点运算可能会以比操作的结果类型更高的精度执行”。这是其他语言不一致结果的主要原因,也是.NET实现不一致结果的原因。http://www.informit.com/articles/article.aspx?p=1648574 - Pascal Cuoq
@PascalCuoq,那个特定的句子在“浮点类型”下,仅包括Single和Double。它与Decimal无关,Decimal有自己的章节在其后面。 - Asik
抱歉,我不知道为什么在那句话中我认为你在谈论二进制浮点数。我很抱歉。 - Pascal Cuoq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接