我是一个新手。我在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上执行基本操作,如加法,乘法和除法?
最重要的是:我该如何解决这个问题?
答案 0 :(得分:2)
您很可能根本不想使用BigInteger
。相反,decimal
可能正是您正在寻找的。 p>
这样的事情:
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
,然后加上这些总和 - 高中代数应该足够好了:)
总而言之,在脑海中(或纸上)进行数学计算有很大帮助。无限小数表达式在数学中非常正常,并且有很多工具可以使用它们。并且有近似,舍入,限制和与此相关的其他内容。