大家好,
我正在使用C2000微控制器来应用电力电子。 最近,我开始面临一个问题,一些浮点变量设置为无穷大。 因此,整个系统会失去控制,并会自动关闭。
我确信硬件中没有问题,因为代码的早期版本在相同的硬件设置中运行良好。 程序中存在一个问题,使变量值变得无穷大。 此问题仅在浮点变量中出现。
以前我没有这么认真地对待这个问题,但现在它变得越来越严重了。
我迫切期待着提出建议或任何建议。
谢谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,
我正在使用C2000微控制器来应用电力电子。 最近,我开始面临一个问题,一些浮点变量设置为无穷大。 因此,整个系统会失去控制,并会自动关闭。
我确信硬件中没有问题,因为代码的早期版本在相同的硬件设置中运行良好。 程序中存在一个问题,使变量值变得无穷大。 此问题仅在浮点变量中出现。
以前我没有这么认真地对待这个问题,但现在它变得越来越严重了。
我迫切期待着提出建议或任何建议。
谢谢!
无限值的问题是一旦一个变量设置为+或-INF,从其派生的任何其他变量也将设置为+inf。
通常,当您将除数除以零时,就会发生这种情况。 按以下方式绑定所有除法操作:
浮子a,b,c
#include "float.h"
IF (fabs(b)< FLT_MIN))
{
IF (((fabs (c)> FLT_MIN)
{
C = MAX_value_for Your _system;//或FLT_MAX
}
否则
{
C = 0;
}
}
否则
{
c = a/b;
}
首先,我的代码中有一个拼写错误。 第二个IF应为IF (((fabs (a)> FLT_MIN))。
现在回答您的问题:
请您解释一下,为什么在第一个条件下,您选择了浮动变量b?
B为除数。 如果除数明显为零,则结果应是您的系统支持的最大值,除非红利也为零。
但问题是,在我的控制循环中,分割操作涉及到很多变量,我不可能保持相同的最小和最大范围。 因此,如果我一次又一次地对所有变量执行相同的代码,那么代码的大小将非常长,代码将不会如此高效。
你能建议我一个想法,我可以在一个循环中绑定所有变量,例如50个浮点变量吗?
您只需进行与划分工序一样多的检查。 如果除数是复杂表达式,则只需检查表达式而不是表达式的各个部分。
您也可以这样做:
如果(0 <(b)< FLT_MIN) b = FLT_MIN
如果(0 >(b)>-FLT_MIN) b =-FLT_MIN
可以使用三元运算符编写,编译器可能会进行优化。
此外,您是否真的需要提前担心性能?