函数bool-isnan(…;)在C++; 我在C++中做定点执行,我试图定义“NO-A”,并支持函数Boel-ISNANN(…),如果数字不是数字,则返回true,否则为false。
有人能给我一些关于如何定义“非数字”和在我的定点数学实现中实现函数bool isnan(…)的想法吗函数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
我已经阅读了关于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表示。他必须选择一个特定的比特模式,你可以吗