如何在C#中将精度提高到128位小数?

时间:2017-04-29 13:22:03

标签: c# .net

我尝试过BigInteger,十进制,漂浮和长但没有运气。 Screenshot of required output example

2 个答案:

答案 0 :(得分:4)

编写自己的理性课程是一项相当容易的任务;记住,有理数只是整数对,你已经有了BigInteger。

在本系列文章中,我展示了如何设计自己的大整数和大理性类,从绝对没有,甚至不是整数。请注意,这并不快,而且不是很快;它旨在教育。您可以使用我在本系列中描述的技术来帮助您设计算术类。

https://ericlippert.com/2013/09/16/math-from-scratch-part-one/

或者,如果您不想自己编写,可以随时使用Microsoft提供的那个:

http://bcl.codeplex.com/wikipage?title=BigRational&referringTitle=Home

但那说......

  

我需要至少128个小数位来计算不同时间步之间事件的精确概率

您是否需要128个小数位来表示精度幅度的128位数?因为如果它只是幅度,那么只需将概率数学转换为对数并进行双数学计算。

答案 1 :(得分:1)

实现任意精度数字的最简单方法是将BigInteger System.Numerics类与int指数结合起来。你可以使用BigInteger作为你的指数,但这可能是过度的,因为这些数字在规模上可能是有意义的。

所以如果你沿着这些方向创建一个类:

public class ArbDecimal
{
    BigInteger value;
    int exponent;
    public override string ToString()
    {
         StringBuilder sb = new StringBuilder();
         int place;
         foreach (char digit in value.ToString())
         {
             if (place++ == value.ToString().Length - exponent)
             {
                 sb.Append('.');
             }
             sb.Append(digit);
         }
         return sb.ToString();
    }
}

然后,您应该能够使用valueexponent字段的索引定律来定义数学运算。

例如,要实现加法,您可以将较大的值缩放为与较小的值相同的指数乘以10^(largerExp-smallerExp),然后将两个值相加并重新缩放。

在您的班级中,数字0.01将表示为:

value = 1

exponent = -2

由于1*10^-2 = 0.01

这一事实

利用这种方法,您可以存储任意精确(和大)数字,仅限于可用的ram和.NET框架的对象大小限制。