Qt4 实现qIsInf 和 qIsNaN 函数

Posted craigtao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt4 实现qIsInf 和 qIsNaN 函数相关的知识,希望对你有一定的参考价值。

标题中的两个函数,在qt4.7版本中没有实现,但是在 Assistant 中索引可以,但是文档中没有介绍,

所以在代码中直接调用的时候,会报错。

 

c++ 也是从11标准之后std 才实现 isinf 和 isnan 这样的功能,

而我使用的开发平台:qt4 vs2008 显然不能期望通过直接使用现有的库函数了

 

在Qt5.6 版本的帮助文档中,这么描述:

bool qIsInf(float f)

Returns true if the float f is equivalent to infinity.

bool qIsNaN(float f)

Returns true if the float f is not a number (NaN).

 

寻思着自己实现,参照qt高版本怎么实现的,

qt5.6 源代码目录位置: C:QtQt5.6.05.6Srcqtbasesrccorelibglobal

三个源文件:

qnumeric.h  //部分代码段

#ifndef QNUMERIC_H
#define QNUMERIC_H

#include <QtCore/qglobal.h>

QT_BEGIN_NAMESPACE


Q_CORE_EXPORT bool qIsInf(double d);
Q_CORE_EXPORT bool qIsNaN(double d);

Q_CORE_EXPORT bool qIsInf(float f);
Q_CORE_EXPORT bool qIsNaN(float f);


QT_END_NAMESPACE

#endif // QNUMERIC_H
qnumeric.cpp 部分代码段

#include "qnumeric.h"
#include "qnumeric_p.h"   //从这里可以判断,qt_is_inf qt_is_nan的实现在这个头文件中
#include <string.h>

QT_BEGIN_NAMESPACE

/*!
    Returns c true if the double a {d} is equivalent to infinity.
    
elates <QtGlobal>
*/
Q_CORE_EXPORT bool qIsInf(double d) { return qt_is_inf(d); }

/*!
    Returns c true if the double a {d} is not a number (NaN).
    
elates <QtGlobal>
*/
Q_CORE_EXPORT bool qIsNaN(double d) { return qt_is_nan(d); }/*!
    Returns c true if the float a {f} is equivalent to infinity.
    
elates <QtGlobal>
*/
Q_CORE_EXPORT bool qIsInf(float f) { return qt_is_inf(f); }

/*!
    Returns c true if the float a {f} is not a number (NaN).
    
elates <QtGlobal>
*/
Q_CORE_EXPORT bool qIsNaN(float f) { return qt_is_nan(f); }

 

qnumeric_p.h 头文件中部分代码段

static inline bool qt_is_inf(float d)
{
    uchar *ch = (uchar *)&d;
    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
        return (ch[0] & 0x7f) == 0x7f && ch[1] == 0x80;
    } else {
        return (ch[3] & 0x7f) == 0x7f && ch[2] == 0x80;
    }
}

static inline bool qt_is_nan(float d)
{
    uchar *ch = (uchar *)&d;
    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
        return (ch[0] & 0x7f) == 0x7f && ch[1] > 0x80;
    } else {
        return (ch[3] & 0x7f) == 0x7f && ch[2] > 0x80;
    }
}

 

这么样的话,就很容易拷贝过来在 qt4中使用了,

    // 数值范围判断 参考 qt5.6源代码 qnumeric.cpp  qnumeric_p.h
    // 源码目录: C:QtQt5.6.05.6Srcqtbasesrccorelibglobal
    static inline bool qIsInf_craig(float f) { return qt_is_inf(f); }

    static inline bool qt_is_inf(float d)
    {
        uchar *ch = (uchar *)&d;
        if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
            return (ch[0] & 0x7f) == 0x7f && ch[1] == 0x80;
        } else {
            return (ch[3] & 0x7f) == 0x7f && ch[2] == 0x80;
        }
    }

    static inline bool qIsNaN_craig(float f) { return qt_is_nan(f); }

    static inline bool qt_is_nan(float d)
    {
        uchar *ch = (uchar *)&d;
        if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
            return (ch[0] & 0x7f) == 0x7f && ch[1] > 0x80;
        } else {
            return (ch[3] & 0x7f) == 0x7f && ch[2] > 0x80;
        }
    }

 

QSysInfo::ByteOrder == QSysInfo::BigEndian

需要包含 头文件 #include <QSysInfo>

 

目前使用还可以,还没有出现不正确的结果,需要继续观察

感谢上帝,

以上是关于Qt4 实现qIsInf 和 qIsNaN 函数的主要内容,如果未能解决你的问题,请参考以下文章

Qt Widget 利用 Qt4.5 实现酷炫透明窗体

隐藏的重载虚函数 OSX QT4

Qt 信号槽

SAP 4代增强

Qt4是不是实现了窗口图标的拖放?

python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html(示例代