为什么SharpDevelop会返回这个错误:运算符'/'不能应用于'double'和'System.Numerics.BigInteger'类型的操作数?

时间:2014-10-23 12:17:37

标签: c# biginteger sharpdevelop

我是一个新手。我在SharpDevelop上创建了一个使用BigInteger结构的C#程序。

这是:

using System;
using System.Numerics;
using System.Linq;


namespace HCC
{
class Program
{
    public static void Main(string[] args)
    {

        BigInteger[] HCC = new[]
        {
            BigInteger.Parse("2"),
            BigInteger.Parse("4"),
            BigInteger.Parse("6"),
            BigInteger.Parse("12"),
            BigInteger.Parse("24"),
        };

        double S;

        int i;

        S=0;

        for(i=0; i<HCC.Length; i++)
        {
            S=S+1.0/HCC[i];
        }

        Console.Write(""+S);

        Console.ReadKey(true);          

    }
}
}

注意:我刚刚放了前5个,但实际上有1000个大整数。有些人的数字超过70位。

问题是SharpDevelop正在显示此错误:

  

运营商&#39; /&#39;不能应用于&#39; double&#39;类型的操作数和&#39; System.Numerics.BigInteger&#39; (CS0019)

这是相对于这一行:

S=S+1.0/HCC[i];

这是什么意思?这是否意味着我们无法在BigIntegers上执行基本操作,如加法,乘法和除法?

最重要的是:我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您很可能根本不想使用BigInteger。相反,decimal可能正是您正在寻找的。

这样的事情:

decimal[] HCC = new [] { 2M, 4M, 6M, 12M, 24M };

...

S += 1M / HCC[i];

十进制是基数为10而不是基数为2,因此它将保证小数精度,而不是二进制。它也有相当大的范围,所以它应该足够你的使用。

哦,如果你在那里有70位数字,你怎么期望它们影响一个数字你只需要精确到7位小数?我觉得你在某个地方错过了一点......

修改

你仍然缺少一个关键点 - 如果你真的正在使用越来越多的数字,那么数字大于20的数字无论如何都不会影响结果。系列的总和收敛于一个给定的数字,你可以很容易地逼近前n个有效数字(看看泰勒系列如何用于例如计算sin (x),这只是另一个无限的十进制表达式)

现在,如果系列是有限的并且不一定增长,你可以做的简单事情就是在做总和之前订购。输入double中的数字 - 不要担心精度损失,不会影响结果(这需要一些数学分析,但我不知道你的背景是什么,所以如果你不能证明你自己,你可能想问一个关于数学SE的问题。从大到小排序。一个接一个地总结它们。结果应该非常精确到大约15位数 - 当你开始加总较大的1 / x时,你会快速丢失远十进制数字,但这些数字不会影响结果。

当然,如果您已经知道这一点,您可以很容易地证明您不需要首先计算大数 - 它们不会影响小数,而不是自己的数字加上大约1-2。如果增长率非常大,那么确切的行为会更加明显(一个非常简单的例子是带有G(n) = 2 ^ n的几何系列),但这看起来很接近你的情况,因为你正在使用小的和同一系列中的数字非常大。如果这还不够好,你可以尝试做一些足够接近的数字的部分和,例如decimal,然后加上这些总和 - 高中代数应该足够好了:)

总而言之,在脑海中(或纸上)进行数学计算有很大帮助。无限小数表达式在数学中非常正常,并且有很多工具可以使用它们。并且有近似,舍入,限制和与此相关的其他内容。