小编Sam*_*mil的帖子

如何在C++中检查无限和不确定的值?

在我的程序中,当值被除以零时通常会出现无穷大.当我将零除零时,我得到了不确定性.如何在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)

有没有更好的方法进行这些检查,我错过了什么吗?

c++ floating-point nan infinity visual-c++

28
推荐指数
2
解决办法
4万
查看次数

在MATLAB-Simulink项目中查找未使用的变量和函数

我有一个复杂的MATLAB-Simulink项目,涉及许多m文件和mdl文件.一些m文件定义了在其他m文件中使用的变量(糟糕的设计,我知道,但它是遗留代码).还有一些功能不再使用.

我需要一种自动方式来查找未使用的变量和函数,以便我可以删除它们并使整个事情变得不那么复杂.理想情况下,我应该有一个脚本/工具,它将项目根目录的名称作为输入,扫描子目录中的所有文件,并输出所有未在任何m文件或mdl文件中使用的变量和函数.

我知道我可以找到mdl文件中没有使用的变量(参见提示和技巧 - 在Simulink模型中跟踪变量).我想将该方法应用于项目中的所有文件.

我想检测m文件中未使用的变量的想法是暂时将所有m文件合并到一个文件中并在上运行mlint.有更好的想法吗?

matlab simulink

6
推荐指数
1
解决办法
4610
查看次数

如何检测基数10十进制是否可以在基数2中精确表示

作为数值库测试的一部分,我需要选择可以在基数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,这是正确的.

有更好的想法吗?

c++

2
推荐指数
1
解决办法
2695
查看次数

如何在一个从s函数调用的单独c文件中使printf工作?

我在文件mySFun.c中有一个s函数,它调用一个函数foo(),该函数在一个单独的文件myFoo.c中实现.当我在mySFun.c中的mdlOutput函数中编写printf语句时,它们工作正常.但是当我将printf放在myFoo.c中的函数foo()中时,它们不会在命令窗口中显示它们的输出.

当printf位于从s函数调用的另一个文件中时,如何启用printf功能?

matlab printf simulink mex

2
推荐指数
1
解决办法
3269
查看次数

如何向Simulink C s函数输入布尔值

我可以通过将布尔数据定义为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)

boolean simulink

1
推荐指数
1
解决办法
3412
查看次数

如何从Matlab C Mex函数中获取两个输出?

我知道如何使用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类型,另一个是整数类型?

c matlab

1
推荐指数
1
解决办法
2398
查看次数

标签 统计

matlab ×3

simulink ×3

c++ ×2

boolean ×1

c ×1

floating-point ×1

infinity ×1

mex ×1

nan ×1

printf ×1

visual-c++ ×1