【问题标题】:How can i get precision up-to 128 decimal places in C#?如何在 C# 中获得高达 128 位小数的精度?
【发布时间】:2017-04-29 13:22:03
【问题描述】:

我尝试过 BigInteger、decimal、float 和 long 但没有运气。 Screenshot of required output example

【问题讨论】:

  • 你能解释一下为什么需要这么高的精度吗?
  • 您能解释一下这么高的精度是什么意思吗?为什么是128?为什么是“128 位小数”?为什么不是 129 位小数或 113?
  • 我正在研究一种算法来模拟网络演化。我需要至少 128 位小数来计算不同时间步长之间事件的精确概率。
  • 有什么方法可以从内置数据类型中获取?或者我应该怎么做才能扩展默认功能?
  • 使用 BigInt 创建类,其指数属性包含小数点的位置。浮点数始终可以表示为整数和指数。

标签: c# .net


【解决方案1】:

编写自己的理性类是一项相当容易的任务;请记住,有理数只是整数对,而您已经拥有 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 位数字吗?因为如果它只是幅度,那么只需将概率数学转换为对数,然后用双精度数计算。

【讨论】:

  • BigRational 看起来不错,我什至不知道它存在。想知道为什么它没有包含在System.Numerics
【解决方案2】:

获得任意精度数的最简单方法是将System.Numerics 中的BigInteger 类与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.


使用此方法,您可以存储任意精确(和大)数字,仅受可用内存和.NET 框架的对象大小限制。

【讨论】:

  • Math.Pow(value,exponent) 不正确,必须是 value * magic.Pow(10, exponent)。请添加魔法。
  • 我的错,在这种情况下实际上是BigInteger.Pow(x,y)。使用 Math.Pow 只是习惯
  • BigInteger.Pow 需要一个整数。
  • 我注意到这正是decimal 在 C# 中的工作方式;十进制存储一个 96 位整数、一个可以从 0 到 28 的指数以及一些标志。
  • @Riz:尾数是大整数。通过编写函数为算术运算编写函数。你是计算机程序员;给电脑编程!
猜你喜欢
  • 2016-02-08
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多