为什么SharpDevelop会返回此错误:Operator'/';不能应用于类型为';双';和

本文关键字:应用于 不能 类型 SharpDevelop 返回 错误 为什么 Operator | 更新日期: 2023-09-27 18:27:30

我是个新手。我在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个1,但实际上有1000个大整数。有些数字超过70位。

问题是SharpDevelop显示了以下错误:

运算符"/"不能应用于类型为"double"answers"System.Numerics.BigInteger"(CS0019)的操作数

它是相对于这条线:

S=S+1.0/HCC[i];

这是什么意思?这是否意味着我们不能在BigIntegers上执行加法、乘法和除法等基本运算?

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

为什么SharpDevelop会返回此错误:Operator'/';不能应用于类型为';双';和

您很可能根本不想使用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上精确相加,然后将这些和相加——高中代数应该足够好:)

总之,在脑子里(或在纸上)做数学有很大帮助。无限小数表达式在数学中是很正常的,有很多工具可以使用它们。以及近似、舍入、极限和其他与此相关的东西。