使用浮点或双精度的浮点计算在硬件上执行,这可能在不同的体系结构或优化设置上给出不同的结果,如
here所述.
在该线程中简要提及但未完全回答的一件事是System.Decimal的情况.有人提到System.Decimal可能会被用作一致的浮点类型,它会非常慢,并且.NET(System.Math)提供的数学函数没有为System.Decimal实现.
我能找到的关于这种类型的唯一信息是Marc Gravell saying,它是用软件实现的,强烈暗示它确实是一致的.
我的问题是:可以使用System.Decimal在所有硬件平台上获得一致的结果,还是容易出现与System.Single和System.Double相同的问题?
如果System.Decimal是一致的,是否有任何免费库为它实现超越函数(cos,sin,tan,sqrt,log等)?
最佳答案 以一种方式保持一致,它将在所有.NET实现上产生相同的结果.
以一种始终代表操作号的正确结果的方式保持一致.任何浮点都会有代表某些价值的麻烦. System.Decimal只能准确地表示那些准确表示为十进制值E.g的数字. 1/3将被错误地表示为0.33333 ……并且cos,sin,tan,sqrt和log的许多结果将是近似值,因为存在任何数字系统(例如十进制或二进制) )是很多值,只能表示为最接近的近似值.
C#规范说:
对十进制类型值的操作结果是计算精确结果(保留每个运算符定义的比例)然后舍入以适合表示形式的结果.结果四舍五入到最接近的可表示值,并且当结果等于接近两个可表示的值时,结果四舍五入到在最低有效数字位置具有偶数的值.