请大家帮我看看是什么原因

zhishy 2009-05-19 07:21:04
程序源码:

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <iomanip>
using namespace std;


int main(int argc, char* argv[])
{
int i = 0;
int j = 0;
int k = 0;
int s = 0;
int N = 5;
int a = 1200;
int L = 600;
double t = 0.1;
double g = 9.81;
double pi = 3.14;
double D = 0.5;
double f = 0.018;
double c0 = 0.009;
double c = 0.0;
double B = 0.0;
double R = 0.0;
double tao = 0.0;
long double Cp[81][6] = {0};
long double Cm[81][6] = {0};
long double H[81][6] = {0};
long double Q[81][6] = {0};

B = (4 * a) / (g * pi * D * D);
R = (8 * f * L) / (g * N * pi * pi * D * D * D * D * D);
//H初始化
for (i = 0; i <= 80; i ++ )
{
H[i][0] = 150;//H的左边界值
}
for (i = 0; i <= 5; i ++ )
{
H[0][i] = 150.0;
Q[0][i] = 0.48;
}

for ( i = 0; i <= 80; i ++ )
{

for ( j = 0; j <= 5; j ++ )
{
if ( i > 0 && j > 0 )
{
Cp[i][j] = H[i-1][j-1] + B * Q[i-1][j-1] - R * Q[i-1][j-1] * abs(Q[i-1][j-1]); //计算第i行所有列的Cp
}
if ( i > 0 && j <= 4 )
{
Cm[i][j] = H[i-1][j+1] - B * Q[i-1][j+1] - R * Q[i-1][j+1] * abs(Q[i-1][j+1]); //计算第i行所有列的Cm
}

}
for (k = 0; k <= 4; k ++)
{
if ( i > 0 && 0 == k )
{
Q[i][k] = ( H[i][k] - Cm[i][k]) / B;
}
if ( i > 0 && k > 0 )
{
H[i][k] = 0.5 * (Cp[i][k] + Cm[i][k]); //计算第i行所有列的H
Q[i][k] = 0.5 * (Cp[i][k] - Cm[i][k]) / B; //计算第i行所有列的Q
}
}
if (i > 0)
{
tao = sqrt( (1 - i * t / 2.1 ) * (1 - i * t / 2.1 ) * (1 - i * t / 2.1 ) );
c = c0 * tao;
Q[i][5] = -g * B * c * c + sqrt(g * g * B * B * c * c * c * c + 2 * g * Cp[i][5] * c * c );
H[i][5] = Cp[i][5] - B * Q[i][5];
}
}

// 输出计算结果
cout << "计算结果:" << endl;
cout << "========================================================================" << endl;
cout << "各点H值" << endl;
cout << "========================================================================" << endl;
for (i = 0; i <= 80; i ++)
{
for (j = 0; j <= 5; j ++)
{
cout << setw(12) << H[i][j];// << '\t';
}
cout << endl;
}
cout << "========================================================================" << endl;
cout << "各点Q值" << endl;
cout << "========================================================================" << endl;
for (i = 0; i <= 80; i ++)
{
for (j = 0; j <= 5; j ++)
{
cout << setw(12) << Q[i][j];// << '\t';
}
cout << endl;
}

system("pause");

return 0;
}



输出结果到第22行时就出现
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
...全文
120 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhishy 2009-05-20
  • 打赏
  • 举报
回复
谢谢12楼和大家的热心帮助谢谢。
ltc_mouse 2009-05-19
  • 打赏
  • 举报
回复
tao = sqrt( (1 - i * t / 2.1 ) * (1 - i * t / 2.1 ) * (1 - i * t / 2.1 ) );
---------------------------
给sqrt传入负数?
i=22时, 1-i*t/2.1 = 1-22*0.1/2.1 = -1/21
xiaoshi935 2009-05-19
  • 打赏
  • 举报
回复
如果没猜错的话就是除0了,一般都是这样,LZ仔细检查一下代码,最好是在每一个计算出来的数后面都加一句输出的语句,这样可以很好的检查出错误来。
fairchild811 2009-05-19
  • 打赏
  • 举报
回复
比如 sum=0/0;
fairchild811 2009-05-19
  • 打赏
  • 举报
回复
IND stands for "indefinite",
"indefinite" is sometimes used to describe the result of trying to divide 0 by 0. Some computers call this value NaN(not a number)
goodname 2009-05-19
  • 打赏
  • 举报
回复
if (i > 0)
{
tao = sqrt( (1 - i * t / 2.1 ) * (1 - i * t / 2.1 ) * (1 - i * t / 2.1 ) );
c = c0 * tao;
Q[i][5] = -g * B * c * c + sqrt(g * g * B * B * c * c * c * c + 2 * g * Cp[i][5] * c * c );
H[i][5] = Cp[i][5] - B * Q[i][5];
}

这里的tao似乎太小了
lingyin55 2009-05-19
  • 打赏
  • 举报
回复
150 145.004 139.565 133.197 130.285 -1.#IND
150 139.293 128.105 120.828 -1.#IND -1.#IND
150 133.101 120.556 -1.#IND -1.#IND -1.#IND
150 131.263 -1.#IND -1.#IND -1.#IND -1.#IND
150 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
150 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
150 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
150 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND


多半是除0了。先检查下代码吧
光宇广贞 2009-05-19
  • 打赏
  • 举报
回复
没错。

因为你计算当中一定遇到了如下情况:


anyInteger / 0

也就是除0的运算。

这就是原因,你检查一下你的代码吧。
xlttap 2009-05-19
  • 打赏
  • 举报
回复
-1.#IND 是说你的数据无穷小,就用这个表示。
和java中一个道理,如输出3/2.3e-309的结果时,就输出Infinity(无穷大)
zhishy 2009-05-19
  • 打赏
  • 举报
回复
可输出结果:
计算结果:
========================================================================
各点H值
========================================================================
150 150 150 150 150 150
150 150 150 150 150 158.466
150 150 150 150 158.466 170.203
150 150 150 158.466 170.203 182.676
150 150 158.466 170.203 182.676 195.885
150 158.466 170.203 182.676 195.885 209.819
150 170.203 182.676 195.885 209.819 224.455
150 174.211 195.885 209.819 224.455 239.756
150 175.682 201.353 224.455 239.756 255.67
150 177.142 204.251 231.29 255.67 272.127
150 178.57 207.08 235.467 263.661 289.036
150 179.937 209.785 239.45 268.833 292.589
150 181.215 212.308 243.151 268.378 290.05
150 182.371 214.582 241.236 264.368 285.172
150 183.366 211.299 235.798 258.03 277.725
150 178.928 204.583 228.092 249.155 267.486
150 171.217 195.722 217.94 237.548 254.247
150 166.794 184.573 205.178 223.032 237.82
150 163.357 176.25 189.666 205.45 218.036
150 159.456 168.449 176.522 184.67 194.743
150 155.092 159.728 163.453 165.815 167.771
150 150.272 150.097 149.021 146.554 147.078
150 145.004 139.565 133.197 130.285 -1.#IND
150 139.293 128.105 120.828 -1.#IND -1.#IND
150 133.101 120.556 -1.#IND -1.#IND -1.#IND
150 131.263 -1.#IND -1.#IND -1.#IND -1.#IND
150 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
150 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
150 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
150 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND

========================================================================
各点Q值
========================================================================
0.48 0.48 0.48 0.48 0.48 0.48
0.48 0.48 0.48 0.48 0.48 0.466418
0.48 0.48 0.48 0.48 0.466418 0.447587
0.48 0.48 0.48 0.466418 0.447587 0.427576
0.48 0.48 0.466418 0.447587 0.427576 0.406385
0.48 0.466418 0.447587 0.427576 0.406385 0.38403
0.452837 0.447587 0.427576 0.406385 0.38403 0.360549
0.415174 0.413994 0.406385 0.38403 0.360549 0.336
0.375152 0.373971 0.370448 0.360549 0.336 0.310469
0.332769 0.331606 0.328136 0.322419 0.310469 0.284067
0.28806 0.286934 0.283576 0.278056 0.270485 0.256938
0.241098 0.240031 0.236853 0.231643 0.224525 0.224074
0.192001 0.191018 0.188097 0.183322 0.185232 0.190486
0.140938 0.140067 0.137487 0.141686 0.149284 0.158289
0.0881336 0.0874068 0.0936566 0.103448 0.114744 0.127855
0.0338759 0.0417229 0.0533679 0.066714 0.0820194 0.0995727
-0.00468775 -0.000162996 0.0147803 0.0319392 0.0515431 0.0738493
-0.0342019 -0.0316304 -0.0215917 -0.000390574 0.0237691 0.0511067
-0.058573 -0.0556306 -0.0468013 -0.0297618 -0.000826976 0.0317841
-0.0770593 -0.0737439 -0.0638007 -0.0472377 -0.0217468 0.0163508
-0.0889148 -0.0852294 -0.0741803 -0.0557858 -0.0300599 0.00536564
-0.0933995 -0.0893512 -0.0772144 -0.0570025 -0.0286733 0
-0.0897876 -0.0853845 -0.0721734 -0.050102 -0.0269426 -1.#IND
-0.0773696 -0.0726098 -0.0582721 -0.0421135 -1.#IND -1.#IND
-0.055432 -0.0502571 -0.0425499 -1.#IND -1.#IND -1.#IND
-0.0231447 -0.0253722 -1.#IND -1.#IND -1.#IND -1.#IND
0.00468775 -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND


输出结果是这样的,是数据过大的原因?
liliangbao 2009-05-19
  • 打赏
  • 举报
回复
INF就是infinite,就是无穷大的意思
IND可能表示很小,不确定
  • 打赏
  • 举报
回复
应该是数据溢出了。

如果不能从算法上改进,就只能用大数库了。
mengde007 2009-05-19
  • 打赏
  • 举报
回复
数据过大,溢出了;

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧