Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数bool-isnan(…;)在C++; 我在C++中做定点执行,我试图定义“NO-A”,并支持函数Boel-ISNANN(…),如果数字不是数字,则返回true,否则为false。_C++_Floating Point_Nan_Fixed Point - Fatal编程技术网

函数bool-isnan(…;)在C++; 我在C++中做定点执行,我试图定义“NO-A”,并支持函数Boel-ISNANN(…),如果数字不是数字,则返回true,否则为false。

函数bool-isnan(…;)在C++; 我在C++中做定点执行,我试图定义“NO-A”,并支持函数Boel-ISNANN(…),如果数字不是数字,则返回true,否则为false。,c++,floating-point,nan,fixed-point,C++,Floating Point,Nan,Fixed Point,有人能给我一些关于如何定义“非数字”和在我的定点数学实现中实现函数bool isnan(…)的想法吗 我已经阅读了关于C++的NANI,但是我不能得到任何源或引用来说明如何手动定义和创建函数n~()以在定点实现中使用它。p> 有人能告诉我如何进行或提供一些继续的参考资料吗 多谢各位 更新固定点标题 #ifndef __fixed_point_header_h__ #define __fixed_point_header_h__ #include <boost/operators.hpp&g

有人能给我一些关于如何定义“非数字”和在我的定点数学实现中实现函数bool isnan(…)的想法吗

我已经阅读了关于C++的NANI,但是我不能得到任何源或引用来说明如何手动定义和创建函数n~()以在定点实现中使用它。p> 有人能告诉我如何进行或提供一些继续的参考资料吗

多谢各位

更新固定点标题

#ifndef __fixed_point_header_h__
#define __fixed_point_header_h__
#include <boost/operators.hpp>
#include <boost/assert.hpp>
#endif
namespace fp {
    template<typename FP, unsigned char I, unsigned char F>
    class fixed_point: boost::ordered_field_operators<fp::fixed_point<FP, I, F>  >
    { 
    //compute the power of 2 at compile time by template recursion
    template<int P,typename T = void> 
    struct power2
    {
        static const long long value = 2 * power2<P-1,T>::value;
    };

    template <typename P>
    struct power2<0, P>
    {
        static const long long value = 1;
    };
    fixed_point(FP value,bool): fixed_(value){ } // initializer list
    public:
    typedef FP base_type; ///  fixed point base type of this fixed_point class.
    static const unsigned char integer_bit_count = I; ///  integer part bit count.
    static const unsigned char fractional_bit_count = F; /// fractional part bit count.
    fixed_point(){ } /// Default constructor.

    //Integer to Fixed point
    template<typename T> fixed_point(T value) : fixed_((FP)value << F)
   {
    BOOST_CONCEPT_ASSERT((boost::Integer<T>)); 
    }
    //floating point to fixed point
    fixed_point(float value) :fixed_((FP)(value * power2<F>::value)){ }
    fixed_point(double value) : fixed_((FP)(value * power2<F>::value))  { }
    fixed_point(long double value) : fixed_((FP)(value * power2<F>::value)) { }
    /// Copy constructor,explicit definition
    fixed_point(fixed_point<FP, I, F> const& rhs): fixed_(rhs.fixed_)
    { }

    // copy-and-swap idiom.

    fp::fixed_point<FP, I, F> & operator =(fp::fixed_point<FP, I, F> const& rhs)
    {
    fp::fixed_point<FP, I, F> temp(rhs); // First, make a copy of the right-hand side
    swap(temp); //swapping the copied(old) data the new data.
    return *this;  //return by reference
    }
    /// Exchanges the elements of two fixed_point objects.
    void swap(fp::fixed_point<FP, I, F> & rhs)
    {
        std::swap(fixed_, rhs.fixed_);
    }
    bool operator <(
        /// Right hand side.
        fp::fixed_point<FP, I, F> const& rhs) const
    {
        return fixed_ < rhs.fixed_;  //return by value
    }

    bool operator ==(
        /// Right hand side.
        fp::fixed_point<FP, I, F> const& rhs) const
    {
        return fixed_ == rhs.fixed_; //return by value
    }
    // Addition.
    fp::fixed_point<FP, I, F> & operator +=(fp::fixed_point<FP, I, F> const& summation)
    {
        fixed_ += summation.fixed_;
        return *this; //! /return A reference to this object.
    }
    /// Subtraction.
    fp::fixed_point<FP, I, F> & operator -=(fp::fixed_point<FP, I, F> const& subtraction)
    {
        fixed_ -= subtraction.fixed_;
        return *this;  // return A reference to this object.
    }
    // Multiplication.
    fp::fixed_point<FP, I, F> & operator *=(fp::fixed_point<FP, I, F> const& factor)
    {
    fixed_ = ( fixed_ * (factor.fixed_ >> F) ) +
        ( ( fixed_ * (factor.fixed_ & (power2<F>::value-1) ) ) >> F );
        return *this;   //return A reference to this object.
    }
    /// Division.
    fp::fixed_point<FP, I, F> & operator /=(fp::fixed_point<FP, I, F> const& divisor)
    {
     fp::fixed_point<FP, I, F> fp_z=1;
     fp_z.fixed_ = ( (fp_z.fixed_) << (F-2) ) / ( divisor.fixed_ >> (2) );
    *this *= fp_z;
     return *this;   //return A reference to this object
    }
private:
    /// The value in fixed point format.
    FP fixed_;
 };

} // namespace fmpl

#endif

#endif // __fixed_point_header__
\ifndef\uu固定点\uu标题\uh__
#定义固定点标题__
#包括
#包括
#恩迪夫
命名空间fp{
模板
类固定点:boost::有序字段\u运算符
{ 
//通过模板递归在编译时计算2的幂
模板
结构power2
{
静态常量long long value=2*power2::value;
};
模板
结构power2
{
静态常量长值=1;
};
固定点(FP值,bool):固定点(值){}//初始值设定项列表
公众:
typedef FP base_type;///此定点类的定点基类型。
static const unsigned char integer\u bit\u count=I;///整数部分位计数。
静态常量无符号字符分数位计数=F;///分数部分位计数。
修复了_point(){}///默认构造函数。
//整数到不动点
模板固定点(T值):固定点((FP)值F))+
((fixed.*(factor.fixed.&(power2::value-1))>>F);
return*this;//返回对此对象的引用。
}
///分部。
fp::固定点和运算符/=(fp::固定点常量和除数)
{
固定点fp_z=1;
fp_z.fixed=((fp_z.fixed)>(2));
*这*=fp_z;
return*this;//返回对此对象的引用
}
私人:
///固定点格式的值。
FP固定值;
};
}//名称空间fmpl
#恩迪夫
#endif/\固定\点\标头__

你能给我们举一个你所说的固定点的例子吗?它是作为类实现的吗?它是固定字节数,还是支持8、16、32、64位数字?如何表示负值

根据这些因素,您可以实现几种可能的不同方式。IEEE浮点数不受影响的原因是,数字采用特殊格式编码,允许根据位模式设置标志。在定点实现中,这可能是不可能的。但是,如果它是一个类,您可以为该类定义算术运算符,然后将结果数设置为nan

更新
看看代码,您似乎只是在值中填充信息。因此,最好的方法可能是在类中有一个isnan标志,并从适当的数学运算中设置它,然后在执行操作之前检查它,以便isnan进行传播。

基本上,您必须留出一些值或一组值来表示NaN。在对象上的每个操作(例如,加法)中,必须测试输入值是否为NaN并做出相应的响应

此外,必须确保正常操作不会无意中产生NaN结果。因此,您必须处理溢出等问题,以确保,如果计算结果将是NaN的位模式,则生成无穷大和/或异常指示和/或任何所需的结果

基本上是这样,;没有魔法


通常,您不希望使用单个位作为标志,因为这会浪费许多可用于表示值的位组合。IEEE 754留出指数字段的一个值(所有1)以指示无穷大(如果有效位字段均为零)或NaN(否则)。这样,只有一小部分位组合用于NAN。(对于32位,232个可能的位组合中有224-2个NAN,因此在NAN上花费的潜在值不到.4%)

通常在没有FPU的嵌入式硬件上使用定点数学。 大多数情况下,这种硬件也缺乏程序或数据空间或/和处理能力

您确定您需要NAN、INF或其他的通用支持吗? 在可以生成SE值的操作上,可以将其作为单独的标志显式实现

然后使用定点算法,您必须非常了解数据,以避免在多个应用程序或分区上出现溢出或下溢。所以你的算法必须以一种避免特殊情况的方式编写

除此之外,即使使用double:一旦在算法中有一个特殊值,它们就会像病毒一样传播,结果是毫无用处的


结论:在我看来,在fixedpoint类中显式实现这一点是对处理能力的极大浪费,因为您必须为每个fixedpoint操作添加条件。条件对DSP或µC的深层cpu管道是有害的。

我的问题清楚/可以理解吗?包含两个连续下划线(
\uuuuuu固定点\uu头\u h\uuuuu)的名称以及以下划线开头并后跟大写字母的名称保留给实现。不要使用它们。@PeteBecker好的,谢谢你,你有没有找到在上面提到的fixedpoint类中实现bool函数isnan()的方法。1。添加标志{bool isNaN;}或2。{-0==NaN}(同时带符号和零),但在这两种情况下,您都需要在所有算术/逻辑子函数中处理它,如+、-、++、-、*、/、%、、=、=、、!=、^、|、&、^、|、&、&、^、|、&、&、@Spektre:他使用第一个模板类型作为存储,这可能是一个整数类型,通常没有-0表示。他必须选择一个特定的比特模式,你可以吗