239
239
<a name="l00216"></a>00216
240
240
<a name="l00217"></a>00217 <span class="keywordflow">return</span> result;
241
241
<a name="l00218"></a>00218 }
242
<a name="l00219"></a>00219
243
<a name="l00220"></a><a class="code" href="structpion_1_1algorithm.html#ab3cce74846661c3585ec5f540a99ff07">00220</a> <span class="keywordtype">void</span> <a class="code" href="structpion_1_1algorithm.html#ab3cce74846661c3585ec5f540a99ff07">algorithm::float_from_bytes</a>(<span class="keywordtype">long</span> <span class="keywordtype">double</span>& value, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr, <span class="keywordtype">size_t</span> num_exp_bits, <span class="keywordtype">size_t</span> num_fraction_bits)
244
<a name="l00221"></a>00221 {
245
<a name="l00222"></a>00222 <span class="comment">// get sign of the number from the first bit</span>
246
<a name="l00223"></a>00223 <span class="keyword">const</span> <span class="keywordtype">int</span> value_sign = (*ptr & 0x80) ? -1 : 1;
247
<a name="l00224"></a>00224
248
<a name="l00225"></a>00225 <span class="comment">// build exponent value from bitstream</span>
249
<a name="l00226"></a>00226 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> mask = 0x80;
250
<a name="l00227"></a>00227 boost::int16_t exponent = 0;
251
<a name="l00228"></a>00228 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n < num_exp_bits; ++n) {
252
<a name="l00229"></a>00229 SHIFT_BITMASK(ptr, mask);
253
<a name="l00230"></a>00230 exponent *= 2;
254
<a name="l00231"></a>00231 <span class="keywordflow">if</span> (*ptr & mask)
255
<a name="l00232"></a>00232 exponent += 1;
256
<a name="l00233"></a>00233 }
257
<a name="l00234"></a>00234
258
<a name="l00235"></a>00235 <span class="comment">// build significand from bitstream</span>
259
<a name="l00236"></a>00236 <span class="keywordtype">long</span> <span class="keywordtype">double</span> significand = exponent ? 1.0 : 0.0;
260
<a name="l00237"></a>00237 <span class="keywordtype">long</span> <span class="keywordtype">double</span> significand_value = 1.0;
261
<a name="l00238"></a>00238 <span class="keywordflow">while</span> (num_fraction_bits) {
262
<a name="l00239"></a>00239 SHIFT_BITMASK(ptr, mask);
263
<a name="l00240"></a>00240 significand_value /= 2;
264
<a name="l00241"></a>00241 <span class="keywordflow">if</span> (*ptr & mask)
265
<a name="l00242"></a>00242 significand += significand_value;
266
<a name="l00243"></a>00243 --num_fraction_bits;
267
<a name="l00244"></a>00244 }
268
<a name="l00245"></a>00245
269
<a name="l00246"></a>00246 <span class="comment">// calculate final value</span>
270
<a name="l00247"></a>00247 exponent -= (::pow((<span class="keywordtype">long</span> double)2, (<span class="keywordtype">int</span>)(num_exp_bits - 1)) - 1);
271
<a name="l00248"></a>00248 value = value_sign * significand * ::pow((<span class="keywordtype">long</span> double)2, exponent);
272
<a name="l00249"></a>00249 }
273
<a name="l00250"></a>00250
274
<a name="l00251"></a><a class="code" href="structpion_1_1algorithm.html#a61872c7ccf75793a16d8ce7961f28842">00251</a> <span class="keywordtype">void</span> <a class="code" href="structpion_1_1algorithm.html#a61872c7ccf75793a16d8ce7961f28842">algorithm::float_to_bytes</a>(<span class="keywordtype">long</span> <span class="keywordtype">double</span> value, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> num_exp_bits, <span class="keywordtype">size_t</span> num_fraction_bits)
275
<a name="l00252"></a>00252 {
276
<a name="l00253"></a>00253 <span class="comment">// first initialize output buffer to zeros</span>
277
<a name="l00254"></a>00254 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr = buf;
278
<a name="l00255"></a>00255 memset(ptr, 0x00, ::ceil(static_cast<float>(num_exp_bits + num_fraction_bits + 1) / 8));
279
<a name="l00256"></a>00256
280
<a name="l00257"></a>00257 <span class="comment">// initialize first byte starting with sign of number</span>
281
<a name="l00258"></a>00258 <span class="keywordflow">if</span> (value < 0) {
282
<a name="l00259"></a>00259 *ptr = 0x80;
283
<a name="l00260"></a>00260 value *= -1;
284
<a name="l00261"></a>00261 }
285
<a name="l00262"></a>00262
286
<a name="l00263"></a>00263 <span class="comment">// break down numbers >= 1.0 by incrementing the exponent & dividing by 2</span>
287
<a name="l00264"></a>00264 boost::int16_t exponent = 0;
288
<a name="l00265"></a>00265 <span class="keywordflow">while</span> (value >= 1) {
289
<a name="l00266"></a>00266 value /= 2;
290
<a name="l00267"></a>00267 ++exponent;
291
<a name="l00268"></a>00268 }
292
<a name="l00269"></a>00269
293
<a name="l00270"></a>00270 <span class="comment">// skip past exponent bits because we don't know the value yet</span>
294
<a name="l00271"></a>00271 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> mask = 0x40;
295
<a name="l00272"></a>00272 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = num_exp_bits; n > 0; --n) {
296
<a name="l00273"></a>00273 <span class="keywordflow">if</span> (n >= 8) {
297
<a name="l00274"></a>00274 ++ptr;
298
<a name="l00275"></a>00275 n -= 7;
299
<a name="l00276"></a>00276 } <span class="keywordflow">else</span> {
300
<a name="l00277"></a>00277 SHIFT_BITMASK(ptr, mask);
301
<a name="l00278"></a>00278 }
302
<a name="l00279"></a>00279 }
303
<a name="l00280"></a>00280
304
<a name="l00281"></a>00281 <span class="comment">// serialize fractional value < 1.0</span>
305
<a name="l00282"></a>00282 <span class="keywordtype">bool</span> got_exponent = <span class="keyword">false</span>;
306
<a name="l00283"></a>00283 boost::uint16_t num_bits = 0;
307
<a name="l00284"></a>00284 <span class="keywordflow">while</span> (value && num_bits < num_fraction_bits) {
308
<a name="l00285"></a>00285 value *= 2;
309
<a name="l00286"></a>00286 <span class="keywordflow">if</span> (got_exponent) {
310
<a name="l00287"></a>00287 <span class="keywordflow">if</span> (value >= 1.0) {
311
<a name="l00288"></a>00288 *ptr |= mask;
312
<a name="l00289"></a>00289 value -= 1.0;
313
<a name="l00290"></a>00290 }
314
<a name="l00291"></a>00291 SHIFT_BITMASK(ptr, mask);
315
<a name="l00292"></a>00292 ++num_bits;
316
<a name="l00293"></a>00293 } <span class="keywordflow">else</span> {
317
<a name="l00294"></a>00294 --exponent;
318
<a name="l00295"></a>00295 <span class="keywordflow">if</span> (value >= 1.0) {
319
<a name="l00296"></a>00296 value -= 1.0;
320
<a name="l00297"></a>00297 got_exponent = <span class="keyword">true</span>;
321
<a name="l00298"></a>00298 }
322
<a name="l00299"></a>00299 }
323
<a name="l00300"></a>00300 }
324
<a name="l00301"></a>00301
325
<a name="l00302"></a>00302 <span class="comment">// normalize exponent.</span>
326
<a name="l00303"></a>00303 <span class="comment">// note: we should have a zero exponent if value == 0</span>
327
<a name="l00304"></a>00304 boost::int32_t high_bit = ::pow((<span class="keywordtype">long</span> double)2, (<span class="keywordtype">int</span>)(num_exp_bits - 1));
328
<a name="l00305"></a>00305 <span class="keywordflow">if</span> (got_exponent)
329
<a name="l00306"></a>00306 exponent += (high_bit - 1);
330
<a name="l00307"></a>00307 <span class="keywordflow">else</span>
331
<a name="l00308"></a>00308 exponent = 0;
332
<a name="l00309"></a>00309
333
<a name="l00310"></a>00310 <span class="comment">// serialize exponent bits</span>
334
<a name="l00311"></a>00311 ptr = buf;
335
<a name="l00312"></a>00312 mask = 0x80;
336
<a name="l00313"></a>00313 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n < num_exp_bits; ++n) {
337
<a name="l00314"></a>00314 SHIFT_BITMASK(ptr, mask);
338
<a name="l00315"></a>00315 <span class="keywordflow">if</span> (exponent >= high_bit) {
339
<a name="l00316"></a>00316 *ptr |= mask;
340
<a name="l00317"></a>00317 exponent -= high_bit;
341
<a name="l00318"></a>00318 }
342
<a name="l00319"></a>00319 high_bit /= 2;
343
<a name="l00320"></a>00320 }
344
<a name="l00321"></a>00321 }
345
<a name="l00322"></a>00322
346
<a name="l00323"></a>00323 } <span class="comment">// end namespace pion</span>
242
<a name="l00219"></a>00219
243
<a name="l00220"></a>00220 <span class="comment">// TODO</span>
244
<a name="l00221"></a>00221 <span class="comment">//std::string algorithm::xml_decode(const std::string& str)</span>
245
<a name="l00222"></a>00222 <span class="comment">//{</span>
246
<a name="l00223"></a>00223 <span class="comment">//}</span>
247
<a name="l00224"></a>00224
248
<a name="l00225"></a><a class="code" href="structpion_1_1algorithm.html#a2177ca0d0f01e6ef6d4d3bceb73d82bb">00225</a> std::string <a class="code" href="structpion_1_1algorithm.html#a2177ca0d0f01e6ef6d4d3bceb73d82bb" title="TODO: escapes XML/HTML-encoded strings (1 &lt; 2).">algorithm::xml_encode</a>(<span class="keyword">const</span> std::string& str)
249
<a name="l00226"></a>00226 {
250
<a name="l00227"></a>00227 std::string result;
251
<a name="l00228"></a>00228 result.reserve(str.size() + 20); <span class="comment">// Assume ~5 characters converted (length increases)</span>
252
<a name="l00229"></a>00229 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*<span class="keyword">></span>(str.c_str());
253
<a name="l00230"></a>00230 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end_ptr = ptr + str.size();
254
<a name="l00231"></a>00231 <span class="keywordflow">while</span> (ptr < end_ptr) {
255
<a name="l00232"></a>00232 <span class="comment">// check byte ranges for valid UTF-8</span>
256
<a name="l00233"></a>00233 <span class="comment">// see http://en.wikipedia.org/wiki/UTF-8</span>
257
<a name="l00234"></a>00234 <span class="comment">// also, see http://www.w3.org/TR/REC-xml/#charsets</span>
258
<a name="l00235"></a>00235 <span class="comment">// this implementation is the strictest subset of both</span>
259
<a name="l00236"></a>00236 <span class="keywordflow">if</span> ((*ptr >= 0x20 && *ptr <= 0x7F) || *ptr == 0x9 || *ptr == 0xa || *ptr == 0xd) {
260
<a name="l00237"></a>00237 <span class="comment">// regular ASCII character</span>
261
<a name="l00238"></a>00238 <span class="keywordflow">switch</span>(*ptr) {
262
<a name="l00239"></a>00239 <span class="comment">// Escape special XML characters.</span>
263
<a name="l00240"></a>00240 <span class="keywordflow">case</span> <span class="charliteral">'&'</span>:
264
<a name="l00241"></a>00241 result += <span class="stringliteral">"&amp;"</span>;
265
<a name="l00242"></a>00242 <span class="keywordflow">break</span>;
266
<a name="l00243"></a>00243 <span class="keywordflow">case</span> <span class="charliteral">'<'</span>:
267
<a name="l00244"></a>00244 result += <span class="stringliteral">"&lt;"</span>;
268
<a name="l00245"></a>00245 <span class="keywordflow">break</span>;
269
<a name="l00246"></a>00246 <span class="keywordflow">case</span> <span class="charliteral">'>'</span>:
270
<a name="l00247"></a>00247 result += <span class="stringliteral">"&gt;"</span>;
271
<a name="l00248"></a>00248 <span class="keywordflow">break</span>;
272
<a name="l00249"></a>00249 <span class="keywordflow">case</span> <span class="charliteral">'\"'</span>:
273
<a name="l00250"></a>00250 result += <span class="stringliteral">"&quot;"</span>;
274
<a name="l00251"></a>00251 <span class="keywordflow">break</span>;
275
<a name="l00252"></a>00252 <span class="keywordflow">case</span> <span class="charliteral">'\''</span>:
276
<a name="l00253"></a>00253 result += <span class="stringliteral">"&apos;"</span>;
277
<a name="l00254"></a>00254 <span class="keywordflow">break</span>;
278
<a name="l00255"></a>00255 <span class="keywordflow">default</span>:
279
<a name="l00256"></a>00256 result += *ptr;
280
<a name="l00257"></a>00257 }
281
<a name="l00258"></a>00258 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr >= 0xC2 && *ptr <= 0xDF) {
282
<a name="l00259"></a>00259 <span class="comment">// two-byte sequence</span>
283
<a name="l00260"></a>00260 <span class="keywordflow">if</span> (*(ptr+1) >= 0x80 && *(ptr+1) <= 0xBF) {
284
<a name="l00261"></a>00261 result += *ptr;
285
<a name="l00262"></a>00262 result += *(++ptr);
286
<a name="l00263"></a>00263 } <span class="keywordflow">else</span> {
287
<a name="l00264"></a>00264 <span class="comment">// insert replacement char</span>
288
<a name="l00265"></a>00265 result += 0xef;
289
<a name="l00266"></a>00266 result += 0xbf;
290
<a name="l00267"></a>00267 result += 0xbd;
291
<a name="l00268"></a>00268 }
292
<a name="l00269"></a>00269 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr >= 0xE0 && *ptr <= 0xEF) {
293
<a name="l00270"></a>00270 <span class="comment">// three-byte sequence</span>
294
<a name="l00271"></a>00271 <span class="keywordflow">if</span> (*(ptr+1) >= 0x80 && *(ptr+1) <= 0xBF
295
<a name="l00272"></a>00272 && *(ptr+2) >= 0x80 && *(ptr+2) <= 0xBF) {
296
<a name="l00273"></a>00273 result += *ptr;
297
<a name="l00274"></a>00274 result += *(++ptr);
298
<a name="l00275"></a>00275 result += *(++ptr);
299
<a name="l00276"></a>00276 } <span class="keywordflow">else</span> {
300
<a name="l00277"></a>00277 <span class="comment">// insert replacement char</span>
301
<a name="l00278"></a>00278 result += 0xef;
302
<a name="l00279"></a>00279 result += 0xbf;
303
<a name="l00280"></a>00280 result += 0xbd;
304
<a name="l00281"></a>00281 }
305
<a name="l00282"></a>00282 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr >= 0xF0 && *ptr <= 0xF4) {
306
<a name="l00283"></a>00283 <span class="comment">// four-byte sequence</span>
307
<a name="l00284"></a>00284 <span class="keywordflow">if</span> (*(ptr+1) >= 0x80 && *(ptr+1) <= 0xBF
308
<a name="l00285"></a>00285 && *(ptr+2) >= 0x80 && *(ptr+2) <= 0xBF
309
<a name="l00286"></a>00286 && *(ptr+3) >= 0x80 && *(ptr+3) <= 0xBF) {
310
<a name="l00287"></a>00287 result += *ptr;
311
<a name="l00288"></a>00288 result += *(++ptr);
312
<a name="l00289"></a>00289 result += *(++ptr);
313
<a name="l00290"></a>00290 result += *(++ptr);
314
<a name="l00291"></a>00291 } <span class="keywordflow">else</span> {
315
<a name="l00292"></a>00292 <span class="comment">// insert replacement char</span>
316
<a name="l00293"></a>00293 result += 0xef;
317
<a name="l00294"></a>00294 result += 0xbf;
318
<a name="l00295"></a>00295 result += 0xbd;
319
<a name="l00296"></a>00296 }
320
<a name="l00297"></a>00297 } <span class="keywordflow">else</span> {
321
<a name="l00298"></a>00298 <span class="comment">// insert replacement char</span>
322
<a name="l00299"></a>00299 result += 0xef;
323
<a name="l00300"></a>00300 result += 0xbf;
324
<a name="l00301"></a>00301 result += 0xbd;
325
<a name="l00302"></a>00302 }
326
<a name="l00303"></a>00303 ++ptr;
327
<a name="l00304"></a>00304 }
328
<a name="l00305"></a>00305
329
<a name="l00306"></a>00306 <span class="keywordflow">return</span> result;
330
<a name="l00307"></a>00307 }
331
<a name="l00308"></a>00308
332
<a name="l00309"></a><a class="code" href="structpion_1_1algorithm.html#ab3cce74846661c3585ec5f540a99ff07">00309</a> <span class="keywordtype">void</span> <a class="code" href="structpion_1_1algorithm.html#ab3cce74846661c3585ec5f540a99ff07">algorithm::float_from_bytes</a>(<span class="keywordtype">long</span> <span class="keywordtype">double</span>& value, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr, <span class="keywordtype">size_t</span> num_exp_bits, <span class="keywordtype">size_t</span> num_fraction_bits)
333
<a name="l00310"></a>00310 {
334
<a name="l00311"></a>00311 <span class="comment">// get sign of the number from the first bit</span>
335
<a name="l00312"></a>00312 <span class="keyword">const</span> <span class="keywordtype">int</span> value_sign = (*ptr & 0x80) ? -1 : 1;
336
<a name="l00313"></a>00313
337
<a name="l00314"></a>00314 <span class="comment">// build exponent value from bitstream</span>
338
<a name="l00315"></a>00315 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> mask = 0x80;
339
<a name="l00316"></a>00316 boost::int16_t exponent = 0;
340
<a name="l00317"></a>00317 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n < num_exp_bits; ++n) {
341
<a name="l00318"></a>00318 SHIFT_BITMASK(ptr, mask);
342
<a name="l00319"></a>00319 exponent *= 2;
343
<a name="l00320"></a>00320 <span class="keywordflow">if</span> (*ptr & mask)
344
<a name="l00321"></a>00321 exponent += 1;
345
<a name="l00322"></a>00322 }
346
<a name="l00323"></a>00323
347
<a name="l00324"></a>00324 <span class="comment">// build significand from bitstream</span>
348
<a name="l00325"></a>00325 <span class="keywordtype">long</span> <span class="keywordtype">double</span> significand = exponent ? 1.0 : 0.0;
349
<a name="l00326"></a>00326 <span class="keywordtype">long</span> <span class="keywordtype">double</span> significand_value = 1.0;
350
<a name="l00327"></a>00327 <span class="keywordflow">while</span> (num_fraction_bits) {
351
<a name="l00328"></a>00328 SHIFT_BITMASK(ptr, mask);
352
<a name="l00329"></a>00329 significand_value /= 2;
353
<a name="l00330"></a>00330 <span class="keywordflow">if</span> (*ptr & mask)
354
<a name="l00331"></a>00331 significand += significand_value;
355
<a name="l00332"></a>00332 --num_fraction_bits;
356
<a name="l00333"></a>00333 }
357
<a name="l00334"></a>00334
358
<a name="l00335"></a>00335 <span class="comment">// calculate final value</span>
359
<a name="l00336"></a>00336 exponent -= (::pow((<span class="keywordtype">long</span> double)2, (<span class="keywordtype">int</span>)(num_exp_bits - 1)) - 1);
360
<a name="l00337"></a>00337 value = value_sign * significand * ::pow((<span class="keywordtype">long</span> double)2, exponent);
361
<a name="l00338"></a>00338 }
362
<a name="l00339"></a>00339
363
<a name="l00340"></a><a class="code" href="structpion_1_1algorithm.html#a61872c7ccf75793a16d8ce7961f28842">00340</a> <span class="keywordtype">void</span> <a class="code" href="structpion_1_1algorithm.html#a61872c7ccf75793a16d8ce7961f28842">algorithm::float_to_bytes</a>(<span class="keywordtype">long</span> <span class="keywordtype">double</span> value, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> num_exp_bits, <span class="keywordtype">size_t</span> num_fraction_bits)
364
<a name="l00341"></a>00341 {
365
<a name="l00342"></a>00342 <span class="comment">// first initialize output buffer to zeros</span>
366
<a name="l00343"></a>00343 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr = buf;
367
<a name="l00344"></a>00344 memset(ptr, 0x00, ::ceil(static_cast<float>(num_exp_bits + num_fraction_bits + 1) / 8));
368
<a name="l00345"></a>00345
369
<a name="l00346"></a>00346 <span class="comment">// initialize first byte starting with sign of number</span>
370
<a name="l00347"></a>00347 <span class="keywordflow">if</span> (value < 0) {
371
<a name="l00348"></a>00348 *ptr = 0x80;
372
<a name="l00349"></a>00349 value *= -1;
373
<a name="l00350"></a>00350 }
374
<a name="l00351"></a>00351
375
<a name="l00352"></a>00352 <span class="comment">// break down numbers >= 1.0 by incrementing the exponent & dividing by 2</span>
376
<a name="l00353"></a>00353 boost::int16_t exponent = 0;
377
<a name="l00354"></a>00354 <span class="keywordflow">while</span> (value >= 1) {
378
<a name="l00355"></a>00355 value /= 2;
379
<a name="l00356"></a>00356 ++exponent;
380
<a name="l00357"></a>00357 }
381
<a name="l00358"></a>00358
382
<a name="l00359"></a>00359 <span class="comment">// skip past exponent bits because we don't know the value yet</span>
383
<a name="l00360"></a>00360 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> mask = 0x40;
384
<a name="l00361"></a>00361 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = num_exp_bits; n > 0; --n) {
385
<a name="l00362"></a>00362 <span class="keywordflow">if</span> (n >= 8) {
386
<a name="l00363"></a>00363 ++ptr;
387
<a name="l00364"></a>00364 n -= 7;
388
<a name="l00365"></a>00365 } <span class="keywordflow">else</span> {
389
<a name="l00366"></a>00366 SHIFT_BITMASK(ptr, mask);
390
<a name="l00367"></a>00367 }
391
<a name="l00368"></a>00368 }
392
<a name="l00369"></a>00369
393
<a name="l00370"></a>00370 <span class="comment">// serialize fractional value < 1.0</span>
394
<a name="l00371"></a>00371 <span class="keywordtype">bool</span> got_exponent = <span class="keyword">false</span>;
395
<a name="l00372"></a>00372 boost::uint16_t num_bits = 0;
396
<a name="l00373"></a>00373 <span class="keywordflow">while</span> (value && num_bits < num_fraction_bits) {
397
<a name="l00374"></a>00374 value *= 2;
398
<a name="l00375"></a>00375 <span class="keywordflow">if</span> (got_exponent) {
399
<a name="l00376"></a>00376 <span class="keywordflow">if</span> (value >= 1.0) {
400
<a name="l00377"></a>00377 *ptr |= mask;
401
<a name="l00378"></a>00378 value -= 1.0;
402
<a name="l00379"></a>00379 }
403
<a name="l00380"></a>00380 SHIFT_BITMASK(ptr, mask);
404
<a name="l00381"></a>00381 ++num_bits;
405
<a name="l00382"></a>00382 } <span class="keywordflow">else</span> {
406
<a name="l00383"></a>00383 --exponent;
407
<a name="l00384"></a>00384 <span class="keywordflow">if</span> (value >= 1.0) {
408
<a name="l00385"></a>00385 value -= 1.0;
409
<a name="l00386"></a>00386 got_exponent = <span class="keyword">true</span>;
410
<a name="l00387"></a>00387 }
411
<a name="l00388"></a>00388 }
412
<a name="l00389"></a>00389 }
413
<a name="l00390"></a>00390
414
<a name="l00391"></a>00391 <span class="comment">// normalize exponent.</span>
415
<a name="l00392"></a>00392 <span class="comment">// note: we should have a zero exponent if value == 0</span>
416
<a name="l00393"></a>00393 boost::int32_t high_bit = ::pow((<span class="keywordtype">long</span> double)2, (<span class="keywordtype">int</span>)(num_exp_bits - 1));
417
<a name="l00394"></a>00394 <span class="keywordflow">if</span> (got_exponent)
418
<a name="l00395"></a>00395 exponent += (high_bit - 1);
419
<a name="l00396"></a>00396 <span class="keywordflow">else</span>
420
<a name="l00397"></a>00397 exponent = 0;
421
<a name="l00398"></a>00398
422
<a name="l00399"></a>00399 <span class="comment">// serialize exponent bits</span>
423
<a name="l00400"></a>00400 ptr = buf;
424
<a name="l00401"></a>00401 mask = 0x80;
425
<a name="l00402"></a>00402 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n < num_exp_bits; ++n) {
426
<a name="l00403"></a>00403 SHIFT_BITMASK(ptr, mask);
427
<a name="l00404"></a>00404 <span class="keywordflow">if</span> (exponent >= high_bit) {
428
<a name="l00405"></a>00405 *ptr |= mask;
429
<a name="l00406"></a>00406 exponent -= high_bit;
430
<a name="l00407"></a>00407 }
431
<a name="l00408"></a>00408 high_bit /= 2;
432
<a name="l00409"></a>00409 }
433
<a name="l00410"></a>00410 }
434
<a name="l00411"></a>00411
435
<a name="l00412"></a>00412 } <span class="comment">// end namespace pion</span>
347
436
</pre></div></div>
348
<hr size="1"/><address style="text-align: right;"><small>Generated on 15 Apr 2013 for pion by
437
<hr size="1"/><address style="text-align: right;"><small>Generated on 26 Jul 2013 for pion by
349
438
<a href="http://www.doxygen.org/index.html">
350
439
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>