/*****************************************************
// //
// 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 //
*****************************************************/
// //
// 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[]);
//---------------------------------------------------
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--;
*/
//--------------------------------------------------
//高至低位元順序排列----------------------------------------
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);
//----------------------------------------
//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回傳值停止點
system("pause");//Value回傳值停止點
return 0;
}
//---------------------------------------------END 32BIT的位移順序及轉換成2位元bit陣列
}
//---------------------------------------------END 32BIT的位移順序及轉換成2位元bit陣列
//START 計算64BIT的Value值--------------------------------------------------------------
long double FR_64bits_Value(char bit_64[])
{
long double value=0;
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回傳值停止點
// system("pause");//value回傳值停止點
return value;
}
//----------------------------------------------------------------END 計算64BIT的Value值
}
//----------------------------------------------------------------END 計算64BIT的Value值
//START 計算64BIT的Sing值--------------------------------------------------------------
int FR_64bits_Sing(char bit_64[])
{
int FR_64bits_Sing(char bit_64[])
{
int sing=1;
if(bit_64[0] == 0)
{
sing = 1;
}
else
{
sing = -1;
}
//cout << sing << endl;//sing回傳值檢查點
if(bit_64[0] == 0)
{
sing = 1;
}
else
{
sing = -1;
}
//cout << sing << endl;//sing回傳值檢查點
return sing;
}
//----------------------------------------------------------------END 計算64BIT的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--;
}
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值
}
//----------------------------------------------------------------END 計算64BIT的Exponent值
//START 計算64BIT的Manyissa值--------------------------------------------------------------
long double FR_64bits_Manyissa(char bit_64[])
{
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的值
}
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值
}
//----------------------------------------------------------------END 計算64BIT的Manyissa值
全站熱搜
留言列表