打印代码结果时发现出现了1.#Q0,就在网上搜索,发现相关的中文资料介绍很少,在stackoverflow上找到了个提问(https://stackoverflow.com/questions/5939573/what-float-value-makes-sprintf-s-produce-1-qo),虽然不完全相同,但还是按照介绍逐步分析,排查其中的原因。
char dispParams[100];
sprintf_s(dispParams,"( %.3f)", dist);
putText(srcImg, dispParams, Point(60,60), 2, 1, CV_RGB(0,255,0),1);
首先,1.#Q0是对1.#QNAN00进行%.3f格式控制输出的结果。Debug下向前排查,找到计算dist的语句:
dist= 0.3*expf (-x * x * rho);
发现x的值为-1.#IND000,导致计算得到的dist的值为1.#QNAN00,-1.#IND000表示负无穷大的意思。
再继续往前排查,查看x的-1.#IND000值是如何出现的。
x = a + b * y;
发现计算x时,a和b的值是-1.#IND000;而导致a和b的值出现问题的原因是:在求解最小二乘拟合系数时,只有1个支撑点,但是却需要求解2个系数,计算过程中出现除数为0,导致求出的系数a和b为-1.#IND000。