全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1197
推到 Plurk!
推到 Facebook!

自製簡易 128 位元浮點數

 
Leeway
一般會員


發表:2
回覆:18
積分:4
註冊:2003-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-03 01:13:09 IP:61.70.xxx.xxx 未訂閱
緣由: 由於 Motorola 68000 CPU 沒有浮點運算單元,故小弟自製虛擬浮點數,
struct DataStruct
{
   DWORD Left;
   DWORD Right;
};
struct DataStruct UserFloat;
其最大數為 (4 byte) 4294967295, 今以 BCB 之 unsigned __int64 資料型態測試, 其最大數為 (8 byte) 18446744073709551615. 程式碼: //--------------------------------------------------------------------
 
#include 
#include 
#include 
#pragma hdrstop
//--------------------------------------------------------------------
struct DataStruct
{
   unsigned __int64 Left;
   unsigned __int64 Right;
};
struct DataStruct UserFloat;    int main(int argc, char* argv[])
{
  cout << "sizeof(byte) : " << sizeof(byte) << endl;
  cout << "sizeof(WORD) : " <<  sizeof(WORD) << endl;
  cout << "sizeof(DWORD) : " <<  sizeof(DWORD) << endl;
  cout << "sizeof(float) : " <<  sizeof(float) << endl;
  cout << "sizeof(double) : " <<  sizeof(double) << endl;
  cout << "sizeof(long long) : " <<  sizeof(long long) << endl;
  cout << "sizeof(__int64) : " <<  sizeof(__int64) << endl;
  cout << "sizeof(unsigned __int64) : " <<  sizeof(unsigned __int64) << endl;      cout << "********************************************" << endl;
  UserFloat.Left = 0x7fffffffffffffffa;
  UserFloat.Right = 0x7fffffffffffffffa;
  cout << "sizeof(UserFloat) : " << sizeof(UserFloat) << endl;
  cout << "Maximum Testing:" << endl;      for(int i=0;i<10;i  )
  {
    cout << UserFloat.Left   << "." << UserFloat.Right   << endl;
  }
  cout << "The Count Is Over" << endl;
  cout << "********************************************" << endl;
  UserFloat.Left = 0x7ffffffffffffffff;
  UserFloat.Right = 0x7ffffffffffffffff;
  cout << "The UserFloat DataType Maximum Is:" << endl;
  cout << UserFloat.Left << "." << UserFloat.Right << endl;
  getch();
  return 0;
}
#pragma argsused
//-------------------------------------------------------------------- 執行結果: sizeof(byte) : 1 sizeof(WORD) : 2 sizeof(DWORD) : 4 sizeof(float) : 4 sizeof(double) : 8 sizeof(long long) : 8 sizeof(__int64) : 8 sizeof(unsigned __int64) : 8 ******************************************** sizeof(UserFloat) : 16 Maximum Testing: 18446744073709551610.18446744073709551610 18446744073709551611.18446744073709551611 18446744073709551612.18446744073709551612 18446744073709551613.18446744073709551613 18446744073709551614.18446744073709551614 18446744073709551615.18446744073709551615 <- 最大值 0.0 <- 溢位 1.1 2.2 3.3 The Count Is Over ******************************************** The UserFloat DataType Maximum Is: 18446744073709551615.18446744073709551615
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-03 09:28:18 IP:221.169.xxx.xxx 未訂閱
呵。有人這樣做喔。不錯喔。 給你一個建議。用字串去做。 這樣就可以不受限制了。 用兩個”數字字串” ex. "123.456" * "456.123" = xxxxx 而用一個位數一個位數去計算。 這樣可以到幾億都能算。只是速度會比較慢。 ^_^
Leeway
一般會員


發表:2
回覆:18
積分:4
註冊:2003-06-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-03 15:54:01 IP:211.20.xxx.xxx 未訂閱
嗯,PC 上確實還有蠻多方法可以擴充, 頭痛的是小弟手上的無作業系統環境並無字串可用阿.... 發表人 -
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-03 16:39:51 IP:221.169.xxx.xxx 未訂閱
哈。沒字串更好。 直接用 BCD 的方式。 還可以省掉 ASCII 轉數字的動作。^_^
Leeway
一般會員


發表:2
回覆:18
積分:4
註冊:2003-06-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-04 12:43:33 IP:61.70.xxx.xxx 未訂閱
係滴...小弟的同事也是這樣搞滴! ^_^
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-05 10:13:04 IP:203.70.xxx.xxx 未訂閱
小弟有一點點好奇ㄟ 你這套浮點數表示法只適合用來顯示吧 如果用來做運算的話問題好像粉多喔 尤其在小數點部分 比如0.198 跟 0.2 做比較... 198 < 2 可是數值上0.2 > 0.198 還有0.20 跟 0.2 是相同的數字,如何去判斷跟轉換也粉麻煩    不過或許你有較完整的CODE,可否公開出來分享一下
Leeway
一般會員


發表:2
回覆:18
積分:4
註冊:2003-06-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-05 18:57:57 IP:211.20.xxx.xxx 未訂閱
是的,主要就是顯示用的. 緣由: 由於 Motorola 68000 CPU 沒有浮點運算單元,且歷來的工程師在這片 PCB 版子上都只使用 WORD,DWORD 這兩種資料型態來避免掉一些特殊的系統陷阱,(且 GAME 畫面是由 RGB CRT 輸出訊號,故無法使用標準函式庫,只能使用公司同仁自製之 Tool 丟圖(包含文字圖形),而這 Tool 又只支援整數),故小弟自製虛擬浮點數,來達到在沒有浮點數可用的環境下又必須計算且顯示浮點數的需求. PS. 這種虛擬浮點數目前剛好適合小弟撰寫之百家樂遊戲使用,由於 Bet 跟 Credit 都是整數,只有在計算 Banker Win 的時候需要抽水 5% ,故 Credit = ((Bet * 95)/100) 即可得到抽水後數值,至於 Bet 的大小會影響到是否需另外處理 UserFloat,還有在計算得分時判斷 UserFloat.Right 是否大於 100 , 來做進位(UserFloat.Left ), 且 UserFloat.Right 清零,.....等等.都是為了在這特殊需求下而產生的. 發表人 - leeway 於 2005/02/05 19:00:34
系統時間:2024-05-19 17:22:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!