線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6573
推到 Plurk!
推到 Facebook!

16bits to +32767 ~ -32767

答題得分者是:ccjl123
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-08-17 23:16:03 IP:1.161.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-08-18 09:45:37 IP:59.120.xxx.xxx 未訂閱
看不出對應關係,以下這兩個不知對副站有沒有幫助

Converting two's complement output to signed decimal


Decimal to Binary
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-08-18 14:08:57 IP:114.35.xxx.xxx 未訂閱
第一個 bit 為 0 ==> 正數,為 1 ==> 負數
正數,取其餘 15 bits 直接換算成 10 進位
負數,取其餘 15 bits 做 not 運算加 1,忽略溢位,再換算成 10 進位
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-08-18 15:57:51 IP:59.127.xxx.xxx 訂閱
前輩,不好意思小弟舉的範例不好讓您誤會,再舉一個例子

小弟目前的做法是先找出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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-08-18 16:03:57 IP:59.127.xxx.xxx 訂閱
感謝前輩, 但我還沒參透 ><

===================引 用 GrandRURU 文 章===================
看不出對應關係,以下這兩個不知對副站有沒有幫助

Converting two's complement output to signed decimal


Decimal to Binary
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-08-19 02:45:15 IP:36.229.xxx.xxx 訂閱
可試以 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-08-19 10:06:16 IP:59.127.xxx.xxx 訂閱
感謝前輩協助, 但仍然會有誤差~
剛開始有誤差的時候我有用小算盤 紙筆手動計算驗證: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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2016-08-02 15:29:57 IP:125.227.xxx.xxx 訂閱
試看看以下是否可以滿足你的需求

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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2016-08-03 09:34:59 IP:59.127.xxx.xxx 訂閱
謝謝幫忙, 但有掉字導致編譯會有問題

===================引 用 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2016-08-03 11:11:43 IP:125.227.xxx.xxx 訂閱
// 換個字形重貼好像就可以了,你再試看看吧
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2016-08-03 11:29:26 IP:125.227.xxx.xxx 訂閱
// 還是不行 改用 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2016-08-03 13:07:42 IP:125.227.xxx.xxx 訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2016-08-03 13:20:43 IP:125.227.xxx.xxx 訂閱
// 不知道為何會斷字
// 另外全形註解好了

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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2016-08-03 13:45:17 IP:125.227.xxx.xxx 訂閱
// 更正
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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2016-08-03 15:31:32 IP:59.127.xxx.xxx 訂閱
謝謝您的幫忙,ok了^^
編輯記錄
taishyang 重新編輯於 2016-08-03 15:32:27, 註解 無‧
taishyang 重新編輯於 2016-08-03 15:32:50, 註解 無‧
taishyang 重新編輯於 2016-08-03 15:33:27, 註解 無‧
taishyang 重新編輯於 2016-08-03 15:40:06, 註解 無‧
系統時間:2024-11-11 3:41:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!