在我的程序中,当值被除以零时通常会出现无穷大.当我将零除零时,我得到了不确定性.如何在C++中检查无限和不确定的值?
在C++中,无穷大由1.#INF表示.Indeterminate由-1表示.#IND.问题是如何测试变量是无限的还是不确定的.检查无穷大是相对简单的:在特定的C++中找到无限定义.对于我的情况(VS2003),它是std :: numeric_limits :: infinity().您必须包含"限制"才能使用它.您可以将此无限值分配给变量,并将其与某个值进行比较,以检查该值是否为无限.
Indeterminate有点棘手,因为您无法将不确定值与其他值进行比较.任何比较都返回false.您可以使用此属性通过将其与自身进行比较来检测不确定值.假设您有一个名为aVal的双变量.在正常情况下,aVal!= aVal返回false.但是如果值是不确定的,则aIndVal!= aIndVal返回true.对于无限值,这种奇怪的情况不存在,即aInfVal!= aInfVal总是返回false.
以下是两个可用于检查不确定和无限值的函数:
#include "limits.h"
#include "math.h"
bool isIndeterminate(const double pV)
{
return (pV != pV);
}
bool isInfinite(const double pV)
{
return (fabs(pV) == std::numeric_limits::infinity())
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法进行这些检查,我错过了什么吗?
我有一个复杂的MATLAB-Simulink项目,涉及许多m文件和mdl文件.一些m文件定义了在其他m文件中使用的变量(糟糕的设计,我知道,但它是遗留代码).还有一些功能不再使用.
我需要一种自动方式来查找未使用的变量和函数,以便我可以删除它们并使整个事情变得不那么复杂.理想情况下,我应该有一个脚本/工具,它将项目根目录的名称作为输入,扫描子目录中的所有文件,并输出所有未在任何m文件或mdl文件中使用的变量和函数.
我知道我可以找到mdl文件中没有使用的变量(参见提示和技巧 - 在Simulink模型中跟踪变量).我想将该方法应用于项目中的所有文件.
作为数值库测试的一部分,我需要选择可以在基数2中精确表示的10位十进制数.如何在C++中检测基数为10的十进制数是否可以在基数2中精确表示?
我的第一个猜测如下:
bool canBeRepresentedInBase2(const double &pNumberInBase10)
{
//check if a number in base 10 can be represented exactly in base 2
//reference: http://en.wikipedia.org/wiki/Binary_numeral_system
bool funcResult = false;
int nbOfDoublings = 16*3;
double doubledNumber = pNumberInBase10;
for (int i = 0; i < nbOfDoublings ; i++)
{
doubledNumber = 2*doubledNumber;
double intPart;
double fracPart = modf(doubledNumber/2, &intPart);
if (fracPart == 0) //number can be represented exactly in base 2
{
funcResult = true;
break;
}
}
return funcResult;
}
Run Code Online (Sandbox Code Playgroud)
我用以下值测试了这个函数:-1.0/4.0,0.0,0.1,0.2,0.205,1.0/3.0,7.0/8.0,1.0,256.0/255.0,1.02,99.005.对于-1.0/4.0,0.0,7.0/8.0,1.0,99.005,它返回true,这是正确的.
有更好的想法吗?
我在文件mySFun.c中有一个s函数,它调用一个函数foo(),该函数在一个单独的文件myFoo.c中实现.当我在mySFun.c中的mdlOutput函数中编写printf语句时,它们工作正常.但是当我将printf放在myFoo.c中的函数foo()中时,它们不会在命令窗口中显示它们的输出.
当printf位于从s函数调用的另一个文件中时,如何启用printf功能?
我可以通过将布尔数据定义为int32来将布尔数据输入到C s函数中(请参见下面的代码)。如何使用SS_BOOLEAN或SS_UINT8类型输入布尔数据?我在Simulink模型和s函数中显式指定了信号数据类型,但是当我将数据定义为boolean或uint8时,得到的是奇怪的数字,而不是1或0。
static void mdlInitializeSizes( SimStruct *S )
{
...
ssSetInputPortRequiredContiguous(S, 0, true);
ssSetInputPortDataType(S, 0, SS_INT32);
...
}
static void mdlOutputs( SimStruct *S, int_T tid )
{
const int *myBoolean = (const int*) ssGetInputPortSignal( S, 0 );
...
}
Run Code Online (Sandbox Code Playgroud)
更新(2011年5月20日):我尝试了MikeT提出的解决方案,但没有成功。作为输出,我期望[10 20 30],但得到[1 2 3]。下面是Simulink模型,命令窗口中的输出和s函数代码:
static void mdlOutputs( SimStruct *S, int_T tid )
{
InputBooleanPtrsType useData1 = (InputBooleanPtrsType) ssGetInputPortSignalPtrs( S, 0 );
InputBooleanPtrsType useData2 = (InputBooleanPtrsType) ssGetInputPortSignalPtrs( S, 1 );
const double *data1 = (const double*) …
Run Code Online (Sandbox Code Playgroud) 我知道如何使用double类型的一个输出编写基本的C Mex函数.我尝试用两个输出写一个C Mex,但是我遇到了分段违规错误.第一个输出是double,第二个是整数.这是我尝试分配输出指针的代码:
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //works fine
plhs[1] = mxCreateNumericArray(1, 1, mxINT32_CLASS, mxREAL); //causes segmentation violation
Run Code Online (Sandbox Code Playgroud)
我搜索了互联网,但几乎所有的例子都只有一个输出或相同类型的输出.应该怎么做才能得到两个输出,一个是double类型,另一个是整数类型?