00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef QNUMERIC_P_H
00025 #define QNUMERIC_P_H
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "QtCore/qglobal.h"
00039
00040 static const unsigned char qt_be_inf_bytes[] = { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 };
00041 static const unsigned char qt_le_inf_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f };
00042 static inline double qtInf()
00043 {
00044 return *reinterpret_cast<const double *>(QSysInfo::ByteOrder == QSysInfo::BigEndian ? qt_be_inf_bytes : qt_le_inf_bytes);
00045 }
00046 #define Q_INFINITY (::qtInf())
00047
00048
00049 static const unsigned char qt_be_snan_bytes[] = { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 };
00050 static const unsigned char qt_le_snan_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f };
00051 static inline double qtSnan()
00052 {
00053 return *reinterpret_cast<const double *>(QSysInfo::ByteOrder == QSysInfo::BigEndian ? qt_be_snan_bytes : qt_le_snan_bytes);
00054 }
00055 #define Q_SNAN (::qtSnan())
00056
00057
00058 static const unsigned char qt_be_qnan_bytes[] = { 0xff, 0xf8, 0, 0, 0, 0, 0, 0 };
00059 static const unsigned char qt_le_qnan_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf8, 0xff };
00060 static inline double qtQnan()
00061 {
00062 return *reinterpret_cast<const double *>(QSysInfo::ByteOrder == QSysInfo::BigEndian ? qt_be_qnan_bytes : qt_le_qnan_bytes);
00063 }
00064 #define Q_QNAN (::qtQnan())
00065
00066 static inline bool qIsInf(double d)
00067 {
00068 uchar *ch = (uchar *)&d;
00069 if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
00070 return (ch[0] & 0x7f) == 0x7f && ch[1] == 0xf0;
00071 } else {
00072 return (ch[7] & 0x7f) == 0x7f && ch[6] == 0xf0;
00073 }
00074 }
00075
00076 static inline bool qIsNan(double d)
00077 {
00078 uchar *ch = (uchar *)&d;
00079 if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
00080 return (ch[0] & 0x7f) == 0x7f && ch[1] > 0xf0;
00081 } else {
00082 return (ch[7] & 0x7f) == 0x7f && ch[6] > 0xf0;
00083 }
00084 }
00085
00086 static inline bool qIsFinite(double d)
00087 {
00088 uchar *ch = (uchar *)&d;
00089 if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
00090 return (ch[0] & 0x7f) != 0x7f || (ch[1] & 0xf0) != 0xf0;
00091 } else {
00092 return (ch[7] & 0x7f) != 0x7f || (ch[6] & 0xf0) != 0xf0;
00093 }
00094 }
00095
00096 static inline bool qIsInf(float d)
00097 {
00098 uchar *ch = (uchar *)&d;
00099 if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
00100 return (ch[0] & 0x7f) == 0x7f && ch[1] == 0x80;
00101 } else {
00102 return (ch[3] & 0x7f) == 0x7f && ch[2] == 0x80;
00103 }
00104 }
00105
00106 static inline bool qIsNan(float d)
00107 {
00108 uchar *ch = (uchar *)&d;
00109 if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
00110 return (ch[0] & 0x7f) == 0x7f && ch[1] > 0x80;
00111 } else {
00112 return (ch[3] & 0x7f) == 0x7f && ch[2] > 0x80;
00113 }
00114 }
00115
00116 static inline bool qIsFinite(float d)
00117 {
00118 uchar *ch = (uchar *)&d;
00119 if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
00120 return (ch[0] & 0x7f) != 0x7f || (ch[1] & 0x80) != 0x80;
00121 } else {
00122 return (ch[3] & 0x7f) != 0x7f || (ch[2] & 0x80) != 0x80;
00123 }
00124 }
00125
00126 #endif // QNUMERIC_P_H