16bits to +32767 ~ -32767
|
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
Dears:
小弟有個數值轉換對應的問題想請教大家,手上有個軟體會做數值轉換的運算
已知
input range:16bits, output range:32767(0x7fff) ~ -32767(0x8001)
想要找出對應公式,目前小弟算出來會差1,但仍想得到正確結果,謝謝大家
例如:輸入(10進位表示), 輸出(16進位表示)
輸入 輸出
7fff |
ffe0 |
bfd0 |
8fc5 |
87c3 |
83c2 |
81c1 |
8001 |
7fff |
3fef |
1fe8 |
07e2 |
f81e |
e018 |
c011 |
8001 |
7fff |
2ab9 |
7fff |
2ab9 |
000b |
5566 |
7fff |
8001 |
8001 |
a493 |
c925 |
edb7 |
1249 |
36db |
5b6d |
7fff |
7fff |
4000 |
2000 |
1000 |
f000 |
e000 |
c000 |
8001 |
8001 |
a493 |
c925 |
edb7 |
1249 |
36db |
5b6d |
7fff |
|
GrandRURU
站務副站長
發表:240 回覆:1680 積分:1874 註冊:2005-06-21
發送簡訊給我
|
|
sryang
尊榮會員
發表:39 回覆:762 積分:920 註冊:2002-06-27
發送簡訊給我
|
第一個 bit 為 0 ==> 正數,為 1 ==> 負數
正數,取其餘 15 bits 直接換算成 10 進位
負數,取其餘 15 bits 做 not 運算加 1,忽略溢位,再換算成 10 進位
------ 歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
前輩,不好意思小弟舉的範例不好讓您誤會,再舉一個例子
小弟目前的做法是先找出min and max, 然後offset讓數據通通變成正值
等比例放大後,再-0x8000
d為最後的結果,但跟原始的AP仍有差異
if (d >= max){
d = 0x7fff;
}else if (d <= min){
d = 0x8001;
}else{
double adj = 0.0;
if (min < 0){
adj = ((double)(d abs(min)) / (max - min)) * 65536;
}else if (min > 0){
adj = ((double)(d - min) / (max - min)) * 65536;
}else{
adj = ((double)d / (max - min)) * 65536;
}
me |
12787 |
7fff |
7fff |
-12604 |
8001 |
8001 |
-11442 |
8bb8 |
8bb7 |
11348 |
717d |
717e |
|
===================引 用
sryang 文 章=================== 第一個 bit 為 0 ==> 正數,為 1 ==> 負數
正數,取其餘 15 bits 直接換算成 10 進位
負數,取其餘 15 bits 做 not 運算加 1,忽略溢位,再換算成 10 進位
編輯記錄
taishyang 重新編輯於 2015-08-19 10:17:09, 註解 無‧
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
aftcast
站務副站長
發表:81 回覆:1485 積分:1763 註冊:2002-11-21
發送簡訊給我
|
可試以 65535 為底 (你用的是65536), 然後(max - min 1 )。你應該是 net 寫的程式,考慮它是 4捨6入5成雙。不知是否會合用?! (也許ok,也許不ok…只是提示你)
我近來太忙,只能用猜的,可能錯很大…請見諒。 ^_^
===================引 用 taishyang 文 章===================
前輩,不好意思小弟舉的範例不好讓您誤會,再舉一個例子
小弟目前的做法是先找出min and max, 然後offset讓數據通通變成正值
等比例放大後,再-0x8000
d為最後的結果,但跟原始的AP仍有差異
if (d >= max){
d = 0x7fff;
}else if (d <= min){
d = 0x8001;
}else{
double adj = 0.0;
if (min < 0){
adj = ((double)(d abs(min)) / (max - min)) * 65536;
}else if (min > 0){
adj = ((double)(d - min) / (max - min)) * 65536;
}else{
adj = ((double)d / (max - min)) * 65536;
}
v = (uint16)Math::Round(adj, 0);
d = v - 0x8000;
}
input
AP |
6720 |
42d4 |
42d5 |
-2108 |
e9d3 |
e9d3 |
-7624 |
b236 |
b236 |
10560 |
698b |
698c |
717e |
===================引 用 sryang 文 章=================== 第一個 bit 為 0 ==> 正數,為 1 ==> 負數
正數,取其餘 15 bits 直接換算成 10 進位
負數,取其餘 15 bits 做 not 運算加 1,忽略溢位,再換算成 10 進位
------
蕭沖
--All ideas are worthless unless implemented--
C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
感謝前輩協助, 但仍然會有誤差~
剛開始有誤差的時候我有用小算盤 紙筆手動計算驗證:P
P.S:四捨五入我有改成
然後(max - min 1 )。你應該是 net 寫的程式,考慮它是 4捨6入5成雙。不知是否會合用?! (也許ok,也許不ok…只是提示你)
我近來太忙,只能用猜的,可能錯很大…請見諒。 ^_^
編輯記錄
taishyang 重新編輯於 2015-08-19 10:19:33, 註解 無‧
|
ccjl123
一般會員
發表:0 回覆:7 積分:11 註冊:2016-08-02
發送簡訊給我
|
試看看以下是否可以滿足你的需求
double iUserMax;
double iUserMin;
void __fastcall TForm1::GetMaxMin()
{
iUserMax=-99999;
iUserMin=99999;
double ret;
int i;
for(i=0;iLines->Count;i )
{
ret=atof(Memo1->Lines->Strings[i].c_str());
if(ret>iUserMax)
iUserMax=ret;
if(ret
iUserMin=ret;
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
AnsiString S;
double Max=32767;
double Min=-32767;
double Middle;
double iUserConver;
short int j;
GetMaxMin();
Memo2->Lines->Clear();
Memo3->Lines->Clear();
for(i=0;i<8;i )
{
iUserConver=atoi(Memo1->Lines->Strings[i].c_str());
Middle=Max-(iUserMax-iUserConver)/(iUserMax-iUserMin)*(Max-Min);
if(iUserConver!=iUserMax)
{
if(Middle<0)
j=Middle-0.5;
else
j=Middle 0.5;
}
else
{
j=Middle;
}
Memo3->Lines->Add(Middle);
S.sprintf("x",j);
if(S.Length()==4)
{
Memo2->Lines->Add(S);
}
else
{
S=S.SubString(5,4);
Memo2->Lines->Add(S);
}
}
}
------ 張榮光
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
謝謝幫忙, 但有掉字導致編譯會有問題
===================引 用 ccjl123 文 章===================
試看看以下是否可以滿足你的需求
double iUserMax;
double iUserMin;
void __fastcall TForm1::GetMaxMin()
{
iUserMax=-99999;
iUserMin=99999;
double ret;
int i;
for(i=0;iLines->Count;i )
{
ret=atof(Memo1->Lines->Strings[i].c_str());
if(ret>iUserMax)
iUserMax=ret;
if(ret iUserMin=ret;
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
AnsiString S;
double Max=32767;
double Min=-32767;
double Middle;
double iUserConver;
short int j;
GetMaxMin();
Memo2->Lines->Clear();
Memo3->Lines->Clear();
for(i=0;i<8;i )
{
iUserConver=atoi(Memo1->Lines->Strings[i].c_str());
Middle=Max-(iUserMax-iUserConver)/(iUserMax-iUserMin)*(Max-Min);
if(iUserConver!=iUserMax)
{
if(Middle<0)
j=Middle-0.5;
else
j=Middle 0.5;
}
else
{
j=Middle;
}
Memo3->Lines->Add(Middle);
S.sprintf("x",j);
if(S.Length()==4)
{
Memo2->Lines->Add(S);
}
else
{
S=S.SubString(5,4);
Memo2->Lines->Add(S);
}
}
}
|
ccjl123
一般會員
發表:0 回覆:7 積分:11 註冊:2016-08-02
發送簡訊給我
|
// 換個字形重貼好像就可以了,你再試看看吧
double iUserMax;
double iUserMin;
void __fastcall TForm1::GetMaxMin()
{
iUserMax=-99999;
iUserMin=99999;
double ret;
int i;
for(i=0;iLines->Count;i )
{
ret=atof(Memo1->Lines->Strings[i].c_str());
if(ret>iUserMax)
iUserMax=ret;
if(ret
iUserMin=ret;
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
AnsiString S;
double Max=32767;
double Min=-32767;
double Middle;
double iUserConver;
short int j;
GetMaxMin();
Memo2->Lines->Clear();
Memo3->Lines->Clear();
for(i=0;i<8;i )
{
iUserConver=atoi(Memo1->Lines->Strings[i].c_str());
Middle=Max-(iUserMax-iUserConver)/(iUserMax-iUserMin)*(Max-Min);
if(iUserConver!=iUserMax)
{
if(Middle<0)
j=Middle-0.5;
else
j=Middle 0.5;
}
else
{
j=Middle;
}
Memo3->Lines->Add(Middle);
S.sprintf("x",j);
if(S.Length()==4)
{
Memo2->Lines->Add(S);
}
else
{
S=S.SubString(5,4);
Memo2->Lines->Add(S);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("1023");
Memo1->Lines->Add("511");
Memo1->Lines->Add("255");
Memo1->Lines->Add("63");
Memo1->Lines->Add("31");
Memo1->Lines->Add("15");
Memo1->Lines->Add("7");
Memo1->Lines->Add("0");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("1023");
Memo1->Lines->Add("511");
Memo1->Lines->Add("255");
Memo1->Lines->Add("63");
Memo1->Lines->Add("-63");
Memo1->Lines->Add("-255");
Memo1->Lines->Add("-511");
Memo1->Lines->Add("-1023");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("1023");
Memo1->Lines->Add("0");
Memo1->Lines->Add("1023");
Memo1->Lines->Add("0");
Memo1->Lines->Add("-512");
Memo1->Lines->Add("512");
Memo1->Lines->Add("1023");
Memo1->Lines->Add("-2048");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("1");
Memo1->Lines->Add("2");
Memo1->Lines->Add("3");
Memo1->Lines->Add("4");
Memo1->Lines->Add("5");
Memo1->Lines->Add("6");
Memo1->Lines->Add("7");
Memo1->Lines->Add("8");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("8");
Memo1->Lines->Add("4");
Memo1->Lines->Add("2");
Memo1->Lines->Add("1");
Memo1->Lines->Add("-1");
Memo1->Lines->Add("-2");
Memo1->Lines->Add("-4");
Memo1->Lines->Add("-8");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("0");
Memo1->Lines->Add("1");
Memo1->Lines->Add("2");
Memo1->Lines->Add("3");
Memo1->Lines->Add("4");
Memo1->Lines->Add("5");
Memo1->Lines->Add("6");
Memo1->Lines->Add("7");
}
//---------------------------------------------------------------------------
------ 張榮光
|
ccjl123
一般會員
發表:0 回覆:7 積分:11 註冊:2016-08-02
發送簡訊給我
|
// 還是不行 改用 IE 瀏覽器試看看
double iUserMax;
double iUserMin;
void __fastcall TForm1::GetMaxMin()
{
iUserMax=-99999;
iUserMin=99999;
double ret;
int i;
for(i=0;iLines->Count;i )
{
ret=atof(Memo1->Lines->Strings[i].c_str());
if(ret>iUserMax)
iUserMax=ret;
if(ret
iUserMin=ret;
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
AnsiString S;
double Max=32767;
double Min=-32767;
double Middle;
double iUserConver;
short int j;
GetMaxMin();
Memo2->Lines->Clear();
Memo3->Lines->Clear();
for(i=0;i<8;i )
{
iUserConver=atoi(Memo1->Lines->Strings[i].c_str());
Middle=Max-(iUserMax-iUserConver)/(iUserMax-iUserMin)*(Max-Min);
if(iUserConver!=iUserMax)
{
if(Middle<0)
j=Middle-0.5;
else
j=Middle 0.5;
}
else
{
j=Middle;
}
Memo3->Lines->Add(Middle);
S.sprintf("x",j);
if(S.Length()==4)
{
Memo2->Lines->Add(S);
}
else
{
S=S.SubString(5,4);
Memo2->Lines->Add(S);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("1023");
Memo1->Lines->Add("511");
Memo1->Lines->Add("255");
Memo1->Lines->Add("63");
Memo1->Lines->Add("31");
Memo1->Lines->Add("15");
Memo1->Lines->Add("7");
Memo1->Lines->Add("0");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("1023");
Memo1->Lines->Add("511");
Memo1->Lines->Add("255");
Memo1->Lines->Add("63");
Memo1->Lines->Add("-63");
Memo1->Lines->Add("-255");
Memo1->Lines->Add("-511");
Memo1->Lines->Add("-1023");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("1023");
Memo1->Lines->Add("0");
Memo1->Lines->Add("1023");
Memo1->Lines->Add("0");
Memo1->Lines->Add("-512");
Memo1->Lines->Add("512");
Memo1->Lines->Add("1023");
Memo1->Lines->Add("-2048");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("1");
Memo1->Lines->Add("2");
Memo1->Lines->Add("3");
Memo1->Lines->Add("4");
Memo1->Lines->Add("5");
Memo1->Lines->Add("6");
Memo1->Lines->Add("7");
Memo1->Lines->Add("8");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("8");
Memo1->Lines->Add("4");
Memo1->Lines->Add("2");
Memo1->Lines->Add("1");
Memo1->Lines->Add("-1");
Memo1->Lines->Add("-2");
Memo1->Lines->Add("-4");
Memo1->Lines->Add("-8");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("0");
Memo1->Lines->Add("1");
Memo1->Lines->Add("2");
Memo1->Lines->Add("3");
Memo1->Lines->Add("4");
Memo1->Lines->Add("5");
Memo1->Lines->Add("6");
Memo1->Lines->Add("7");
}
------ 張榮光
|
ccjl123
一般會員
發表:0 回覆:7 積分:11 註冊:2016-08-02
發送簡訊給我
|
double iUserMax;
double iUserMin;
void __fastcall TForm1::GetMaxMin()
{
iUserMax=-99999;
iUserMin=99999;
double ret;
int i;
for(i=0;iLines->Count;i ) // for(i=0;iLines->Count;i )
{
ret=atof(Memo1->Lines->Strings[i].c_str());
if(ret>iUserMax)
iUserMax=ret;
if(ret
iUserMin=ret; // iUserMin=ret;
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
AnsiString S;
double Max=32767;
double Min=-32767;
double Middle;
double iUserConver;
short int j;
GetMaxMin();
Memo2->Lines->Clear();
Memo3->Lines->Clear();
for(i=0;i<8;i )
{
iUserConver=atoi(Memo1->Lines->Strings[i].c_str());
Middle=Max-(iUserMax-iUserConver)/(iUserMax-iUserMin)*(Max-Min);
if(iUserConver!=iUserMax)
{
if(Middle<0)
j=Middle-0.5;
else
j=Middle 0.5;// j=Middle 0.5
}
else
{
j=Middle;
}
Memo3->Lines->Add(Middle);
S.sprintf("x",j); // S.sprintf("x",j);
if(S.Length()==4)
{
Memo2->Lines->Add(S);
}
else
{
S=S.SubString(5,4);
Memo2->Lines->Add(S);
}
}
}
------ 張榮光
|
ccjl123
一般會員
發表:0 回覆:7 積分:11 註冊:2016-08-02
發送簡訊給我
|
// 不知道為何會斷字
// 另外全形註解好了
double iUserMax;
double iUserMin;
void __fastcall TForm1::GetMaxMin()
{
iUserMax=-99999;
iUserMin=99999;
double ret;
int i;
for(i=0;iLines->Count;i ) //<<Memo1->Lines->Count
{
ret=atof(Memo1->Lines->Strings[i].c_str());
if(ret>iUserMax)
iUserMax=ret;
if(ret iUserMin=ret; // if(ret<iUserMin) ret=iUserMin
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
AnsiString S;
double Max=32767;
double Min=-32767;
double Middle;
double iUserConver;
short int j;
GetMaxMin();
Memo2->Lines->Clear();
Memo3->Lines->Clear();
for(i=0;i<8;i )
{
iUserConver=atoi(Memo1->Lines->Strings[i].c_str());
Middle=Max-(iUserMax-iUserConver)/(iUserMax-iUserMin)*(Max-Min);
if(iUserConver!=iUserMax)
{
if(Middle<0)
j=Middle-0.5;
else
j=Middle 0.5;// j=Middle+0.5
}
else
{
j=Middle;
}
Memo3->Lines->Add(Middle);
S.sprintf("x",j); //S=S.sprintf("%04x",j)
if(S.Length()==4)
{
Memo2->Lines->Add(S);
}
else
{
S=S.SubString(5,4);
Memo2->Lines->Add(S);
}
}
}
------ 張榮光
|
ccjl123
一般會員
發表:0 回覆:7 積分:11 註冊:2016-08-02
發送簡訊給我
|
// 更正
double iUserMax;
double iUserMin;
void __fastcall TForm1::GetMaxMin()
{
iUserMax=-99999;
iUserMin=99999;
double ret;
int i;
for(i=0;iLines->Count;i ) //<<Memo1->Lines->Count
{
ret=atof(Memo1->Lines->Strings[i].c_str());
if(ret>iUserMax)
iUserMax=ret;
if(ret iUserMin=ret; // if(ret<iUserMin) iUserMin=ret << 更正這
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
AnsiString S;
double Max=32767;
double Min=-32767;
double Middle;
double iUserConver;
short int j;
GetMaxMin();
Memo2->Lines->Clear();
Memo3->Lines->Clear();
for(i=0;i<8;i )
{
iUserConver=atoi(Memo1->Lines->Strings[i].c_str());
Middle=Max-(iUserMax-iUserConver)/(iUserMax-iUserMin)*(Max-Min);
if(iUserConver!=iUserMax)
{
if(Middle<0)
j=Middle-0.5;
else
j=Middle 0.5;// j=Middle+0.5
}
else
{
j=Middle;
}
Memo3->Lines->Add(Middle);
S.sprintf("x",j); //S=S.sprintf("%04x",j)
if(S.Length()==4)
{
Memo2->Lines->Add(S);
}
else
{
S=S.SubString(5,4);
Memo2->Lines->Add(S);
}
}
}
------ 張榮光
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!
|