控制台程序出现-(nan)ind的问题

ssw940521 2016-04-19 10:01:37

//位置信息
struct Tuple {
long float attr1;
long float attr2;
};
//获得当前簇的质心
Tuple getMeans(vector<Tuple> cluster) {

int num = cluster.size();
long float meansX = 0, meansY = 0;
Tuple t;
for (int i = 0; i < num; i++)
{
meansX += cluster[i].attr1;
meansY += cluster[i].attr2;
}
t.attr1 = meansX / num;
t.attr2 = meansY / num;
return t;
}
//获得给定簇集的平方误差(vector版)
float V_getVar(vector<Tuple> clusters[], vector<Tuple> means) {
float var = 0;
for (int i = 0; i < k; i++)
{
vector<Tuple> t = clusters[i];
for (int j = 0; j< t.size(); j++)
{
var += getDistXY(t[j], means[i]);
}
}
//cout<<"sum:"<<sum<<endl;
return var;

}
float oldVar = -1;
float newVar = V_getVar(cluster, tuple);

while (abs(newVar - oldVar) >= 1) //当新旧函数值相差不到1即准则函数值不发生明显变化时,算法终止
{
tuple.clear();
for (int j = 0; j < k; j++) //更新每个簇的中心点
{
tuple.push_back(getMeans(cluster[j]));
cout << "更新" << tuple[j].attr1 <<" "<<tuple[j].attr2<< endl;//问题就在这里,当k大于6的时候控制台就会输出-(nan)ind
}

for (int i = 0; i < k; i++) //清空每个簇
{
cluster[i].clear();
}
//根据新的质心获得新的簇
for (int i = 0; i < clusters.size(); i++) {
lable = clusterofTuple(tuple, clusters[i]);//means->initial
cluster[lable].push_back(clusters[i]);
}

oldVar = newVar;
newVar = V_getVar(cluster, tuple); //计算新的准则函数值

}





问题是为什么会出现这个-(nan)ind,而且由于我数据点是随机生成的,这个-(nan)ind的出现时多时少,是什么原因???
...全文
1871 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿纳金 2016-04-24
  • 打赏
  • 举报
回复
看看是不是分母为0 了。num如果为0 ,除法之后就-1.#之类的
小灸舞 2016-04-20
  • 打赏
  • 举报
回复
-1.#IND / nan:这个的情况更复杂,一般来说,它们来自于任何未定义结果(非法)的浮点数运算。"IND"是 indeterminate 的缩写,而"nan"是 not a number 的缩写。产生这个值的常见例子有:对负数开平方,对负数取对数,0.0/0.0,0.0*∞, ∞/∞ 等。举个例子,如果log()内的值是1.#INF,得到的log值就会是,1.#INF。 所以简而言之,如果遇到 1.#INF / inf,就检查是否发生了运算结果溢出除零,而遇到 1.#IND / nan,就检查是否发生了非法的运算。
赵4老师 2016-04-20
  • 打赏
  • 举报
回复
INFO: NAN & INF Internal Representation Specific to Coprocessor Last reviewed: August 26, 1997 Article ID: Q22320 The information in this article applies to: The C Run-time (CRT) included with: - Microsoft C for MS-DOS, versions 6.0, 6.0a, 6.0ax - Microsoft C for OS/2, versions 6.0, 6.0a - Microsoft C/C++ for MS-DOS, versions 7.0, 7.0a - Microsoft Visual C++ for Windows, versions 1.0, 1.5 - Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 4.0, 5.0 SUMMARY The internal representation for the values NAN (Not A Number) and INF (Infinity) depend on the numeric coprocessor installed in your computer. For information on these values, refer to the "Numeric Supplement" in the "Intel iAPX Programmer's Reference Manual" for the specific coprocessor. -------------------------------------------------------------------------------- Additional query words: 8087 80287 80387 Keywords : CRTIss Version : MS-DOS:6.0,6.00a,6.00ax,7.0,7.00a; OS/2:6.0,6.00a; WINDOWS:1.0,1.5; WINDOWS NT:1.0,2.0,4.0,5.0 Platform : MS-DOS NT OS/2 WINDOWS Issue type : kbinfo THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Last reviewed: August 26, 1997 © 1998 Microsoft Corporation. All rights reserved. Terms of Use.
赵4老师 2016-04-20
  • 打赏
  • 举报
回复
可能是你的随机数生成逻辑有问题。参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
    return (
     (((unsigned long)rand()<<24)&0xFF000000ul)
    |(((unsigned long)rand()<<12)&0x00FFF000ul)
    |(((unsigned long)rand()    )&0x00000FFFul));
}
unsigned __int64 ullrand(void) {
    return (
     (((unsigned __int64)ulrand())<<32)
    | ((unsigned __int64)ulrand()));
}
int i;
unsigned long ul;
unsigned __int64 ull;
void main() {
    srand(time(NULL));
    for (i=0;i<10;i++) {
        ul=ulrand();
        printf("%010lu 0x%08x\n",ul,ul);
    }
    for (i=0;i<10;i++) {
        ull=ullrand();
        printf("%020I64u 0x%016I64x\n",ull,ull);
    }
}
//3971076432 0xecb1d150
//2433428051 0x910b2a53
//1415415336 0x545d8628
//1312330759 0x4e389407
//1845758378 0x6e0409aa
//0008069933 0x007b232d
//4202720757 0xfa806df5
//2669855255 0x9f22c217
//0312068736 0x1299ca80
//2084555989 0x7c3fccd5
//03502077880857307931 0x3099e1472040ab1b
//16884702393146816355 0xea52835e19b43763
//01877364819396611730 0x1a0dbd5b45f34e92
//07839440151924835771 0x6ccb4948756a05bb
//09471412086917299176 0x8371371c820bfbe8
//04411255971577469925 0x3d37edef2f321be5
//13735846279546091130 0xbe9f876a65b7367a
//04512980766520059820 0x3ea15418aa9927ac
//15821377118299441610 0xdb90d2a9f1bb49ca
//15512417228822200185 0xd7472d480398bf79

64,648

社区成员

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

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