4

使用浮点数或双精度的浮点计算是在硬件上执行的,这可能会在不同的架构或优化设置上给出不同的结果,如此所述。

在该线程上简要提到但未完全回答的一件事是 System.Decimal 的情况。有人提到 System.Decimal可能用作一致的浮点类型,它会非常慢,并且 .NET (System.Math) 提供的数学函数没有为 System.Decimal 实现。

我能找到的关于这种类型的唯一其他信息是 Marc Gravell说它是在软件中实现的,这强烈暗示它确实是一致的。

因此,我的问题是:System.Decimal 能否用于在所有硬件平台上获得一致的结果,还是容易出现与 System.Single 和 System.Double 相同的问题?

如果 System.Decimal 是一致的,是否有任何免费库为其实现超越函数(cos、sin、tan、sqrt、log 等)?

4

1 回答 1

2

以某种方式一致,它将在所有 .NET 实现上产生相同的结果是的。

以始终表示操作的正确结果的方式保持一致。任何浮点数在表示某些值时都会遇到麻烦。System.Decimal只能准确表示那些可以准确表示为十进制值的数字,例如 1/3 将不准确地表示为 0.33333……而 cos、sin、tan、sqrt 和 log 的许多结果将是近似值,因为事实上,对于任何数字系统(例如十进制或二进制)来说,很多值只能表示为最接近的近似值。

C# 规范说: The result of an operation on values of type decimal is that which would result from calculating an exact result (preserving scale, as defined for each operator) and then rounding to fit the representation. Results are rounded to the nearest representable value, and, when a result is equally close to two representable values, to the value that has an even number in the least significant digit position.

于 2012-12-12T08:36:13.077 回答