284{
285 unsigned short buf=0x0000;
288 if(nMantLength<8)
289 {
290 std::cout<<"Requested mantissa reduction is too large: 23->"<<nMantLength<<std::endl;
291 return false;
292 }
293 std::vector<FloatRep>::const_iterator fIt;
294
295
300 {
301 unsigned short int ex=(*fIt).exponent();
302 std::uint32_t mant=(*fIt).mantissa();
304 if(i==j)
305 {
308 }
309 else
310 {
313 }
314 if((ex!=0)&&(mant!=0))
315 {
316 if((ex<bias)||(ex-bias>limit))
317 {
318 return false;
319 }
320 }
321 ++fIt;
322 }
323
324
326 for(std::vector<Triplet>::iterator trIt=
m_tripVec.begin();trIt!=
m_tripVec.end();++trIt)
327 {
328 int i1,i2[2];
329 i1=(*trIt).m_d;
330 i2[0]=(*trIt).m_nd1;i2[1]=(*trIt).m_nd2;
331
334
336 buf =
buf | ((
e<<12) & 0xF000);
337 if((src[i2[0]].exponent()==0)&&(src[i2[0]].mantissa()==0))
338 {
339 e=
src[i2[0]].exponent();
341 }
342 else
343 {
344 if(src[i2[0]].
sign())
347 }
349 if((src[i2[1]].exponent()==0)&&(src[i2[1]].mantissa()==0))
350 {
352 e=
src[i2[1]].exponent();
353 }
354 else
355 {
357 if(src[i2[1]].
sign())
359 }
361
364 }
365
367 unsigned int nPacked=0;
368 int nFreeBits=0,nBitsToStore=0,nBufferLength=0;
369 std::uint32_t srcBuffer=0x00000000u;
370
371 while (nPacked<=
src.size()+1)
372 {
373 if(nFreeBits==0)
374 {
375 if(nBufferLength!=0)
376 {
378
379 }
381 nFreeBits=16;
382 nBufferLength++;
383 }
384 if(nBitsToStore==0)
385 {
386 if(nPacked!=0)
387 ++fIt;
388 if(fIt==
src.end())
break;
389 nPacked++;
390 srcBuffer=((*fIt).mantissa()<<9);
391
392 nBitsToStore=nMantLength;
393 }
394 int Np=(nBitsToStore>nFreeBits)?nFreeBits:nBitsToStore;
397 slice = (
slice >> (32-nFreeBits)) & 0x0000FFFF;
399
401 srcBuffer = srcBuffer << Np;
402
403 nFreeBits-=Np;
404 nBitsToStore-=Np;
405 }
407 return true;
408}