/*****************************************************
//             //
//  SUPERSTAR II  Firmware Reference   //
//             //
//   FR 64bits Value演算程式     //
//             //
// 1.此程式原始碼由Microsoft Visual C++ 6.0撰寫。 //
// 2.本程式由C及C++程式碼構成,無使用到特殊函式。 //
// 3.主函式接收陣列格式:8陣列,正整數內容。  //
// 4.請注意主程式所接收FR的陣列格式是否正確。  //
// 5.FR陣列接收格式必須使用"unsigned char name[]"。//
//             //
//        此程式由swszg撰寫 //
//     E-MAIL:allen_szg@yahoo.com.tw //
*****************************************************/

//函式宣告--------------------------------------------
#include<iostream>  
#include<math.h>
#include<stdlib.h>  
  
using  std :: cout;
using  std :: endl;
//int main();//脫離主程式檢查點
long double FR_64bits(unsigned char in_buff[]);
long double FR_64bits_Value(char bit_64[]);
int   FR_64bits_Sing(char bit_64[]);
long double FR_64bits_Manyissa(char bit_64[]);
int   FR_64bits_Exponen(char bit_64[]);
//---------------------------------------------------
 

//START 64BIT的位移順序及轉換成2位元bit陣列--------------------------------------------
//int main()//脫離主程式檢查點
long double FR_64bits(unsigned char in_buff[])
{
 int k=7,m,j,i,a;
 char c16to2[8],bit[64];
//數值測試點----------------------------------------
/*
 //27.799999928 {0x00,0x00,0x96,0xCB,0xCC,0xCC,0x3B,0x40}
 //0.4136642514 {0x98,0xA9,0xDB,0x9F,0x79,0x79,0xDA,0x3F}
 //2.1018790404 {0xA3,0xED,0x56,0xF5,0xA5,0xD0,0x00,0x40}
 unsigned char in_buff[8]={0x00,0x00,0x96,0xCB,0xCC,0xCC,0x3B,0x40};//程式測試點
*/
//--------------------------------------------------
//高至低位元順序排列----------------------------------------
 for(j=0;j<8;j++)
 {
//-------------------------------------------------------------------------------------
  a = in_buff[j];
//  cout<< a <<endl;
  for(i=7;i>0;i--)
  {
   c16to2[i] = a%2;
   a = a / 2;
  }c16to2[0]=a;
//  cout<< a <<endl;
//c16to2陣列檢查點---------------------------------------------------------------------
/*
  for(i=0;i<8;i++)
  {
   int print = c16to2[i];
   cout<< print ;
  }
  cout<< endl ;
*/
//-------------------------------------------------------------------------------------
  for(m=0;m<8;m++)
   {
    i = 0;
    i = 8 * k + m;
    bit[i]=c16to2[m];
   }
   
  k--;
 }
//----------------------------------------
//bit陣列檢查點------------------------------------------------------------------------
/*
 for(i=0;i<64;i++)
 {
  int print = bit[i];
  cout<< print ;
 }
*/
//-------------------------------------------------------------------------------------
 long double Value=0;
 Value = FR_64bits_Value(bit);
 cout<< Value ;//Value檢查點
 system("pause");//Value回傳值停止點
 return 0;
}
//---------------------------------------------END 32BIT的位移順序及轉換成2位元bit陣列
//START 計算64BIT的Value值--------------------------------------------------------------
long double FR_64bits_Value(char bit_64[])

 long double value=0;
 value = FR_64bits_Sing(bit_64) * (1+FR_64bits_Manyissa(bit_64)) * pow(2,FR_64bits_Exponen(bit_64)-1023) ;
// cout << value << endl;//value回傳值檢查點
// system("pause");//value回傳值停止點
 return value;
}
//----------------------------------------------------------------END 計算64BIT的Value值
//START 計算64BIT的Sing值--------------------------------------------------------------
int FR_64bits_Sing(char bit_64[])
{
 int sing=1;
 if(bit_64[0] == 0)
 {
  sing = 1;
 }
 else
 {
  sing = -1;
 }
 
 //cout << sing << endl;//sing回傳值檢查點
 return sing;
}
//----------------------------------------------------------------END 計算64BIT的Sing值
//START 計算64BIT的Exponent值--------------------------------------------------------------
int FR_64bits_Exponen(char bit_64[])
{
 int exponent=0;
 int i,n=10;
 for (i=1;i<12;i++)
 {
  exponent = exponent + bit_64[i] * pow(2,n);//計算Exponen的值
  n--;
 }
 //cout << exponent << endl;//exponent回傳值檢查點
 return exponent;
}
//----------------------------------------------------------------END 計算64BIT的Exponent值
//START 計算64BIT的Manyissa值--------------------------------------------------------------
long double FR_64bits_Manyissa(char bit_64[])
{
 long double manyissa=0;
 int i,n=0;
 for (i=12;i<65;i++)
 {
  n++;
  manyissa = manyissa + bit_64[i] * pow(2,-n);//計算Manyissa的值  
 }
 //cout << manyissa << endl;//manyissa回傳值檢查點
 return manyissa;
}
//----------------------------------------------------------------END 計算64BIT的Manyissa值
 
arrow
arrow
    全站熱搜

    swszg 發表在 痞客邦 留言(0) 人氣()