0

[更新]

这是我的代码:

double tmp=0;

double A=4.87149e+07;
double B=10;
double C=5.29e-06;
...

double sum=0;
ofstream M2;
M2.open("C:/capture/M2.doc");
for (i=0;i<916;i++)
{
    for (int j=0;j<916;j++)
    {
            tmp=A*B*C;
            sum= sum+tmp;
            M2 << sum << "\n";
    }
}

'我有什么上面:

当我打印总和时,它给了我一个 NaN 结果。

当我从求和公式中省略 C 时,它给了我一个非 Nan 结果。因此,我相信编译器假装它是关于 +oo/-oo 乘法(A 很大,C 很小),但事实并非如此!

我正在处理这样的重要数据。

我想在 TextEdit 的末尾打印结果:

plainTextEdit->setPlainText(QString::number(sum));

一旦我恰好达到 i 计数循环 (458) 和 j (458) 的一半,Sum 的值就等于 -1.#IND

如何处理?

4

1 回答 1

0

运行以下:

#include <iostream>
#include <fstream>
#include <QDebug>

int main(int argc, char *argv[])
{
    double tmp=0;

    double A=4.87149e+07;
    double B=10;
    double C=5.29e-06;

    double sum=0;
    std::ofstream M2;
    M2.open("M2.doc");
    for (int i=0;i<916;i++)
    {
        for (int j=0;j<916;j++)
        {
                tmp=A*B*C;
                sum= sum+tmp;
                M2 << sum << "\n";
        }
        qDebug() << sum;
    }
}

产量:(M2.doc 的第 1-10 行)

2577.02
5154.04
7731.05
10308.1
12885.1
15462.1
18039.1
20616.1
23193.2
25770.2

...(第 209760-209770 行)209764 是 i = 458 和 j = 458

5.40555e+008
5.40558e+008
5.4056e+008
5.40563e+008
5.40566e+008
5.40568e+008
5.40571e+008
5.40573e+008
5.40576e+008
5.40579e+008
5.40581e+008

...(第 839047 到 839056 行也就是结尾)

2.16224e+009
2.16224e+009
2.16224e+009
2.16225e+009
2.16225e+009
2.16225e+009
2.16225e+009
2.16226e+009
2.16226e+009
2.16226e+009

我在 Notepad++ 中打开了文件,因为 MS Word 很难处理这么长的文件。 tmp可能被编译器优化为几乎完全像一个常量: 2577.02,或者如果你使用 printf 你可以很容易地看到一些额外的精度: 2577.018210. 该qDebug()行对终端产生类似的答案。

谷歌的计算器输出

double可以跟踪大量值:

#include <limits>
//...
printf("%g\n", std::numeric_limits<double>::min());
printf("%g\n", std::numeric_limits<double>::max());

打印出来

2.22507e-308
1.79769e+308

用我的设置。

我希望这会有所帮助。

于 2013-04-05T17:09:25.117 回答