aboutsummaryrefslogtreecommitdiff
path: root/c++-qt/src/float.cpp
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2012-03-31 17:34:11 +0000
committerMike Buland <eichlan@xagasoft.com>2012-03-31 17:34:11 +0000
commit82da0238a8171cf8bba6bb1c82d5abba207a10aa (patch)
tree83ff9b022b658e7a056fc85f132937b8bda4c1c3 /c++-qt/src/float.cpp
parent7dd5c386611e31930e7ccfb83cb585df27696881 (diff)
downloadlibgats-82da0238a8171cf8bba6bb1c82d5abba207a10aa.tar.gz
libgats-82da0238a8171cf8bba6bb1c82d5abba207a10aa.tar.bz2
libgats-82da0238a8171cf8bba6bb1c82d5abba207a10aa.tar.xz
libgats-82da0238a8171cf8bba6bb1c82d5abba207a10aa.zip
Gats for QT is here. It's a pretty basic conversion right now, it doesn't
support debugging formatting (Bu::sio), it doesn't support gats-text string parsing, and the exceptions need to be fixed to be real exceptions. The basic functions have been renamed to match the Qt API and we use QT types for everything (QHash, QList, QByteArray). It needs more testing, but it's a great start.
Diffstat (limited to '')
-rw-r--r--c++-qt/src/float.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/c++-qt/src/float.cpp b/c++-qt/src/float.cpp
new file mode 100644
index 0000000..a82edec
--- /dev/null
+++ b/c++-qt/src/float.cpp
@@ -0,0 +1,122 @@
1#include "gats-qt/float.h"
2#include "gats-qt/integer.h"
3
4#include <math.h>
5
6Gats::Float::Float() :
7 fVal( 0.0 )
8{
9}
10
11Gats::Float::Float( double f ) :
12 fVal( f )
13{
14}
15
16Gats::Float::~Float()
17{
18}
19
20void Gats::Float::write( QIODevice &rOut ) const
21{
22 if( fVal == 0.0 )
23 {
24 if( signbit( fVal ) )
25 rOut.write("FZ", 2 );
26 else
27 rOut.write("Fz", 2 );
28 }
29 else if( !isfinite( fVal ) )
30 {
31 if( isnan( fVal ) )
32 {
33 if( signbit( fVal ) )
34 rOut.write("FN", 2 );
35 else
36 rOut.write("Fn", 2 );
37 }
38 else
39 {
40 if( signbit( fVal ) )
41 rOut.write("FI", 2 );
42 else
43 rOut.write("Fi", 2 );
44 }
45 }
46 else
47 {
48 rOut.write("f", 1 );
49 double d = fVal;
50 bool bNeg = false;
51 int64_t iScale=0;
52 if( signbit( d ) )
53 {
54 bNeg = true;
55 d = -d;
56 }
57
58 iScale = log( d ) / 0x1.62e42fefa39efp+2; // log( 256.0 )
59 if( iScale < 0 ) iScale--;
60 d /= pow( 256.0, iScale );
61
62 QByteArray s;
63 s += (uint8_t)(d);
64 d -= (int)d;
65 for( int j = 0; j < 150 && d; j++ )
66 {
67 d = d*256.0;
68 s += (uint8_t)d;
69 d -= (int)d;
70 }
71 Gats::Integer::writePackedInt( rOut, bNeg?-s.size():s.size() );
72 rOut.write( s.constData(), s.size() );
73 Gats::Integer::writePackedInt( rOut, iScale );
74 }
75}
76
77void Gats::Float::read( QIODevice &rIn, char cType )
78{
79 if( cType == 'F' )
80 {
81 char buf;
82 rIn.read( &buf, 1 );
83 switch( buf )
84 {
85 case 'N': fVal = -NAN; break;
86 case 'n': fVal = NAN; break;
87 case 'I': fVal = -INFINITY; break;
88 case 'i': fVal = INFINITY; break;
89 case 'Z': fVal = -0.0; break;
90 case 'z': fVal = 0.0; break;
91 }
92 }
93 else if( cType == 'f' )
94 {
95 int64_t iStr;
96 Gats::Integer::readPackedInt( rIn, iStr );
97 bool bNeg = false;
98 if( iStr < 0 )
99 {
100 bNeg = true;
101 iStr = -iStr;
102 }
103 QByteArray s( iStr, '\0' );
104 rIn.read( s.data(), iStr );
105 fVal = 0.0;
106 for( int j = iStr-1; j > 0; j-- )
107 {
108 fVal = (fVal+(uint8_t)s[j])*0x1p-8;
109 }
110 fVal += (uint8_t)s[0];
111 int64_t iScale;
112 Gats::Integer::readPackedInt( rIn, iScale );
113 fVal *= pow( 256.0, iScale );
114 if( bNeg ) fVal = -fVal;
115 }
116}
117/*
118Bu::Formatter &operator<<( Bu::Formatter &f, const Gats::Float &flt )
119{
120 return f << "(float) " << flt.getValue();
121}*/
122