为什么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上执行加法、乘法和除法等基本运算?
最重要的是:我该如何解决这个问题?
您很可能根本不想使用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
上精确相加,然后将这些和相加——高中代数应该足够好:)
总之,在脑子里(或在纸上)做数学有很大帮助。无限小数表达式在数学中是很正常的,有很多工具可以使用它们。以及近似、舍入、极限和其他与此相关的东西。