如何在输出中不包含 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 的情况下计算一个非常大的数组?的主要内容,如果未能解决你的问题,请参考以下文章

计算二维数组每行中非 NaN 值的数量

抓住我在计算中得到 NaN 的那一刻

pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)

如何在 Prometheus/Grafana 中不指定标签的情况下通过唯一标签计算指标数量?

在 PHP 中不使用太多内存的情况下读取/写入大型 XML

在存在 NaN 的情况下将 pandas 列拆分为新列