在PlainText小部件中显示double值时出错

时间:2013-04-05 13:18:16

标签: c++ visual-studio-2010 qt

[UPDATE]

这是我的代码:

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

如何处理?

1 个答案:

答案 0 :(得分: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.018210qDebug()行产生与终端类似的答案。

Google's calculator output

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

使用我的设置。

我希望有所帮助。