[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
如何处理?
答案 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.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
使用我的设置。
我希望有所帮助。