如何在输出中不包含 NaN 的情况下计算一个非常大的数组?
Posted
技术标签:
【中文标题】如何在输出中不包含 NaN 的情况下计算一个非常大的数组?【英文标题】:How do I calculate an array of very large numbers without getting NaN in my output? 【发布时间】:2017-08-22 03:46:21 【问题描述】:我制作了一个适用于小数字的计算器,但是当结果太大时,它会返回 NaN
List<string> memory = new List<string> ;
string display = "";
while (display.Contains("%") == false)
string line = ReadLine();
display = line;
memory.Add(line);
float result = float.Parse(memory[0]);
for (int i = 1; i < memory.Count; i++)
string temp = memory[i];
char[] _temp = temp.ToCharArray();
_temp = _temp.Where(x => x > _temp[0]).ToArray();
float num = float.Parse(string.Join("", _temp));
if (temp.Contains("+") == true) result += num;
else if (temp.Contains("-") == true) result -= num;
else if (temp.Contains("*") == true) result *= num;
else if (temp.Contains("/") == true) result /= num;
else if (temp.Contains("%") == true) result %= num;
以这些数字为例:
797 * 2 + 38 * 212 * 275 * 806 * 67 * 9939 + 7 + 74 + 515 + 610 * 516 * 6921
+ 4 * 2 * 494 * 3153 * 8 + 2501 * 769 + 4 * 2472 + 1 * 21 * 6535 + 30 + 26
+ 44 + 240 + 88 * 1111 * 817 * 1576 + 551 * 535 + 9150 + 36 * 85 * 4598
* 9276 * 766 + 584 + 5 * 1 + 7 + 45 * 8152 % 7984
我在新的 readline 中输入每个数字,并在其前面加上数学符号。 如果您使用这些数字对其进行测试,请注意。
我到处寻找,无法找到解决此问题的方法,以便它可以返回一个实数。
有人知道我可以做些什么来解决这个问题吗?
【问题讨论】:
见***.com/questions/4160988/… "797 * 2 + 38 * 212" 给定您的解析器,我认为您没有考虑关联 - 一方面应该解决 797 * 2,另一方面应该解决 38*212,并且添加这两个值。我相信你的计算器是从左到右读取的,没有考虑到这一点 【参考方案1】:您使用的值对于浮点数来说太大了。当值对于您的浮点数来说太大时,它会返回 PositiveInfinity(或 NegativeInfinity)而不是数字值。根据MSDN:
当运算结果大于 MaxValue 时返回该常数。
因此您的浮点数变为“无穷大”而不是数字。
然后,当您尝试除法或取模之类的操作时,float 会返回 NaN。同样,来自MSDN:
当运算结果未定义时,方法或运算符返回 NaN。
所以当你将你的浮点数(无穷大)除以一个数字时,结果是 NaN
您可能需要考虑使用BigInteger。
【讨论】:
【参考方案2】:适用以下限制:
浮点数:7 位(32 位) 双位:15-16 位(64 位) 十进制:28-29 位有效数字(128 位)【讨论】:
这是误导。Decimal
的范围比 Double
小得多,但在其范围内更精确。以上是关于如何在输出中不包含 NaN 的情况下计算一个非常大的数组?的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)