C功能和NaN

时间:2013-11-19 12:56:44

标签: c matlab simulink

你好每个人我都写了一些代码作为Mfiles并使用Matlab函数生成一个自动S函数,每件事都很好但是由于某些原因我被迫自己编写C函数。 现在的问题是这样的:我只是将代码翻译成C,它们在视觉工作室中没问题,但是当我在我的功能中使用它们时,我得到了一些无效的答案。 (NAN)。 我检查了第一个地方,我的答案变成了NaN,我发现它是在想要运行我的QR分解代码的时候。 a& b是doubles,当a=-0.00000& b=0.000000它返回NaN,而代码如下:

if (b==0)
{
    c=1;
    s=0;
}

else if (abs(b)>abs(a))
{
    r=a/b;
    s=1/sqrt(1+r*r);
    c=r*s;
}

else
{
    r=b/a;
    s=1/sqrt(1+r*r);
    c=r*s;
}

我甚至将条件改为: 如果(ABS(B)< 0.001)) 但它再次没有进入这种状况。 为了避免使用NaN我将最后else更改为:else if(a!=0) 并添加了一个新的其他只是拳头如果。我的意思是:

if (b==0)
{
    c=1;
    s=0;
} else if (abs(b)>abs(a))
{
    r=a/b;
    s=1/sqrt(1+r*r);
    c=r*s;
}else if(a!=0)
{
    r=b/a;
    s=1/sqrt(1+r*r);
    c=r*s;
}else
{
    c=1;
    s=0;
}

但是:1。这不是一个好方法(只是一个技巧)2。我的最终答案有错误(10 ^( - 5))

现在作为结论:1。我需要知道为什么视觉效果与Matlab不相同的相同代码? 我该怎么办?我处于紧急状态,我需要一种很好的方法来计算与S函数兼容的C中矩阵的QR分解。或者至少是计算矩阵确定性的好方法,即使它接近奇点。

1 个答案:

答案 0 :(得分:4)

你在visual studio和MATLAB(sfunction)上获得不同结果的原因很可能是你的程序的行为未定义
条件abs(b)>abs(a)是错误的。 abs期望int类型参数返回int。在您将ab定义为double时,您应该使用fabs;期望double类型参数并返回double值。

else if (fabs(b) > fabs(a)){ ... }