2011年4月12日火曜日

80bit浮動小数点数を64bit浮動小数点数におとす


double float80Tofloat64( BYTE* bin )
{
  // とりあえず符号セット
  double ret = 0;
  Utility::bitCopy( &ret, 63, bin, 79, 1 );
 
  // 指定部コピー
  DWORD e = 0;
  Utility::bitCopy( &e, 0, bin, 64, 15 );
  // 15bitの2の歩数解除
  e -= 0x3FFF;
  // 11bitの2の歩数セット
  e += 0x3FF;
  // 指定部をセット
  Utility::bitCopy( &ret, 52, &e, 0, 11 );
 
  // 仮数部をセット(80bitFloatは暗黙ビットが存在せず1が余分にあるのでカットしつつ52bit分コピー)
  Utility::bitCopy( &ret, 0, bin, 11/**64-52でさらに上位1bit不要なので-1 = 11*/, 52 );
 
  return ret;
}

bitCopyは生産がす: ビット単位のコピーのを使用。
 80bit浮動小数点数の44.1Kと22.05Kは64bitに正しく変換できたのを確認したが、そのほかは知らぬ。
誤差で大変なことになるのが予想される場合はお勧めしない。
 
 あとはaiffデータ部分をwavのデータに変換すれば再生可能か。
半年がかりだ
 もうちょっとわかりやすくunion + bit fieldでうまいことできないかと四苦八苦してみたがうまくいかなかった。ちょっと技術力が足りない。

0 件のコメント: