青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-163  評論-223  文章-30  trackbacks-0
存儲格式
   Oracle Number數據類型是變長的,占0~22字節,不像編程語言中的2/4字節整數或4/8字節浮點數,關于它的存儲格式與解析,DSI上有詳細的描述,如下所示
             
   
   符號位/指數字節描述如下
            
   
   數字字節描述如下
            
   
   正數或零值的計算
            
   
   負數值的計算
            

解析實現
   由于Oracle Number的精度高達38位,遠超出了基本定長整數或浮點數表達的數值范圍,因此解析實際上是大整數/實數的四則運算,為避免造輪子,本文使用了GMP開源庫(https://gmplib.org/),用于任意精度的算術運算,操作有符號整數、有理數和浮點數,除了在GMP機器上運行的可用內存所暗示的精度之外,對精度沒有實際的限制。解析實現的核心函數是orcl_raw2number
 1 #include <stdio.h>
 2 #include <assert.h>
 3 #include <gmp.h>
 4 
 5 #define MAX_PREC  256
 6 
 7 static mpf_t s_base100;
 8 static mpf_t s_one;
 9 
10 static void init_mpf_globals()
11 {
12     mpf_init_set_ui(s_base100, 100);
13     mpf_init_set_ui(s_one, 1);
14 }
15 
16 static void clear_mpf_globals()
17 {
18     mpf_clear(s_base100);
19     mpf_clear(s_one);
20 }
21 
22 static void orcl_raw2number(unsigned char *data, unsigned int len, mpf_t result)
23 {
24     unsigned int sign = *data, digit, i;
25     int exp = sign>=128 ? sign-193 : 62-sign;
26     int exp_val;
27     mpf_t tmp;
28 
29     mpf_init2(tmp, MAX_PREC);
30     mpf_init2(result, MAX_PREC);
31 
32     if(sign & 0x80){
33         for(i=1; i<len; ++i){
34             digit = data[i] - 1;
35             assert(0<=digit && digit<=99);
36 
37             exp_val = exp - i + 1;
38             if(exp_val < 0){ 
39                 mpf_pow_ui(tmp, s_base100, -exp_val);
40                 mpf_div(tmp, s_one, tmp);    
41             }else
42                 mpf_pow_ui(tmp, s_base100, exp_val);
43                                 
44             mpf_mul_ui(tmp, tmp, digit);
45             mpf_add(result, result, tmp);
46         }
47     
48     }else{
49         --len; //ignore the last byte
50         for(i=1; i<len; ++i){
51             digit = 101 - data[i];
52             assert(0<=digit && digit<=99);
53 
54             exp_val = exp - i + 1;
55             if(exp_val < 0){ 
56                 mpf_pow_ui(tmp, s_base100, -exp_val);
57                 mpf_div(tmp, s_one, tmp);    
58             }else
59                 mpf_pow_ui(tmp, s_base100, exp_val);
60                                 
61             mpf_mul_ui(tmp, tmp, digit);
62             mpf_add(result, result, tmp);
63         }
64 
65         mpf_neg(result, result);
66     }
67     
68     mpf_clear(tmp);
69 }

測試用例
   測試了123456.789、-123456.789、Oracle Number實際最大最小值、Oracle Number理論最大最小值
 1 int main(int argc, char *argv[])
 2 {
 3     int n = 19;
 4     char buf[256];
 5     mpf_t r;
 6 
 7     init_mpf_globals();
 8 
 9     //123456.789
10     unsigned char data[] = {0xc3,0xd,0x23,0x39,0x4f,0x5b};    
11     orcl_raw2number(data, sizeof(data), r);
12     gmp_snprintf(buf, sizeof(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);
13     printf("result: %s\n", buf);
14     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");
15     mpf_clear(r);
16 
17     //-123456.789
18     unsigned char data2[] = {0x3c,0x59,0x43,0x2d,0x17,0xb,0x66};
19     orcl_raw2number(data2, sizeof(data2), r);
20     gmp_snprintf(buf, sizeof(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);
21     printf("result: %s\n", buf);
22     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");
23     mpf_clear(r);
24 
25     //0
26     unsigned char zero[] = {0x80};
27     orcl_raw2number(zero, sizeof(zero), r);
28     gmp_snprintf(buf, sizeof(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);
29     printf("result: %s\n", buf);
30     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");
31     mpf_clear(r);
32 
33     //test actual max value:99999(the number of 9 is 38)
34     unsigned char max_data[] = {0xd3,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64};
35     orcl_raw2number(max_data, sizeof(max_data), r);
36     gmp_snprintf(buf, sizeof(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);
37     printf("result: %s\n", buf);
38     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");
39     mpf_clear(r);
40 
41     //test actual min value:-99999(the number of 9 is 38)
42     unsigned char min_data[] = {0x2c,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x66};    
43     orcl_raw2number(min_data, sizeof(min_data), r);
44     gmp_snprintf(buf, sizeof(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);
45     printf("result: %s\n", buf);
46     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");
47     mpf_clear(r);
48 
49     clear_mpf_globals();
50 
51     //test max oracle number value
52     mpf_init2(r, 256);
53 
54     mpf_set_str(r, "1e125", 10);
55     mpf_out_str(NULL, 10, 0, r); printf("\n");
56     gmp_printf("%Ff\n", r);
57     
58     //test min oracle number value
59     mpf_set_str(r, "-1e125", 10);
60     mpf_out_str(NULL, 10, 0, r); printf("\n");
61     gmp_printf("%Ff\n", r);
62 
63     mpf_clear(r);
64 
65     return 0;
66 }
   輸出如下
   
posted on 2020-05-08 12:23 春秋十二月 閱讀(964) 評論(0)  編輯 收藏 引用 所屬分類: Database
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情 亚洲a∨综合| 欧美精品成人| 亚洲成人在线免费| 久久综合久色欧美综合狠狠| 午夜在线精品偷拍| 久久国产精品黑丝| 久久精品1区| 猫咪成人在线观看| 91久久精品国产91性色tv| 日韩一区二区精品视频| 亚洲一区二区在线| 久久精品主播| 欧美日韩精品伦理作品在线免费观看 | 久久久精品日韩| 老司机午夜精品视频| 欧美极品欧美精品欧美视频| 欧美午夜一区二区三区免费大片 | 亚洲自拍偷拍网址| 久久综合电影一区| 日韩一级精品| 久久精品五月婷婷| 国产精品草草| …久久精品99久久香蕉国产| 国产精品99久久久久久久女警| 久久精品一区二区国产| 91久久久久久| 久久久综合精品| 国产精品久久久久久亚洲调教 | 亚洲一区二区在线看| 国产精品永久免费观看| 在线日本高清免费不卡| 亚洲小说区图片区| 男人插女人欧美| 亚洲欧美另类中文字幕| 欧美乱大交xxxxx| 韩国av一区二区三区| 亚洲欧美不卡| 亚洲人成网站777色婷婷| 久久国产综合精品| 国产精品日韩一区二区三区| 亚洲精品视频一区二区三区| 久久免费黄色| 午夜在线一区二区| 国产精品久久久久久户外露出 | 国产一区二区三区四区| 99国产精品私拍| 欧美va日韩va| 久久久久久9| 国产一区二区三区不卡在线观看| 一区二区精品国产| 欧美激情在线观看| 美女亚洲精品| 亚洲欧洲在线免费| 亚洲国产精品va| 欧美成人在线免费观看| 亚洲国产综合在线| 欧美激情bt| 欧美国产丝袜视频| 99热在线精品观看| 亚洲理论电影网| 欧美三日本三级少妇三99| 亚洲视频在线观看免费| 亚洲美女色禁图| 欧美日韩天堂| 亚洲欧美中文另类| 校园激情久久| 亚洲黄色免费| 日韩天天综合| 国产嫩草影院久久久久| 久久免费视频在线| 牛人盗摄一区二区三区视频| 亚洲美女淫视频| 一区二区三区欧美| 国产偷久久久精品专区| 免费日韩视频| 欧美日韩亚洲一区二区三区| 亚洲欧美资源在线| 久久久久久久综合| 正在播放日韩| 欧美淫片网站| 99re6热只有精品免费观看| 中文一区字幕| 精品成人国产在线观看男人呻吟| 欧美激情视频一区二区三区免费 | 欧美综合国产精品久久丁香| 亚洲少妇最新在线视频| 国产日产精品一区二区三区四区的观看方式 | 99这里有精品| 亚洲欧美国产毛片在线| 亚洲电影av在线| 在线亚洲免费| 亚洲电影中文字幕| 亚洲午夜精品17c| 亚洲大胆在线| 亚洲一区区二区| 亚洲日本一区二区三区| 午夜精品福利一区二区蜜股av| 亚洲电影免费| 亚洲欧美日韩天堂| 99精品国产热久久91蜜凸| 羞羞视频在线观看欧美| 亚洲美女在线一区| 欧美怡红院视频| 亚洲一区三区视频在线观看| 久久青草欧美一区二区三区| 亚洲制服av| 欧美激情第3页| 蜜桃久久av一区| 国产精品网曝门| 日韩视频精品| 亚洲美女中文字幕| 久久在线91| 久久天堂成人| 国产日韩av一区二区| 日韩一区二区免费高清| 亚洲激情成人| 久久久久网址| 久久亚洲电影| 国产日韩在线视频| 亚洲午夜在线观看| 夜夜嗨av一区二区三区网页| 久久夜色精品国产| 久久久久一区二区| 国产日韩欧美在线观看| 中文国产成人精品久久一| 亚洲精品五月天| 麻豆成人综合网| 美女图片一区二区| 一区二区视频免费完整版观看| 性一交一乱一区二区洋洋av| 午夜精品久久久久久99热软件| 欧美日韩精品不卡| 日韩性生活视频| 亚洲在线成人精品| 国产精品女主播一区二区三区| 亚洲免费成人av| 在线视频精品一| 欧美视频一区二| 亚洲欧美一区二区激情| 久久九九热免费视频| 伊人狠狠色丁香综合尤物| 久久久精品日韩| 亚洲狠狠婷婷| 亚洲特级片在线| 国产视频一区在线| 狂野欧美激情性xxxx欧美| 亚洲第一久久影院| 在线亚洲免费| 亚洲国产精品久久久久婷婷884| 国产精品美女久久久| 亚洲自拍16p| 久久久国产一区二区三区| 韩国欧美一区| 欧美成人黄色小视频| 亚洲精品在线视频观看| 午夜精品亚洲一区二区三区嫩草| 国产精品美女一区二区在线观看| 亚洲专区免费| 欧美www视频| 亚洲性感美女99在线| 国产亚洲一本大道中文在线| 免费久久精品视频| 中文欧美字幕免费| 美女日韩在线中文字幕| 中国成人在线视频| 好看的亚洲午夜视频在线| 欧美精品在线看| 久久国产日韩| 日韩视频永久免费观看| 久久综合网hezyo| 亚洲一二区在线| 亚洲二区在线| 国产精品久久久久一区二区| 久久久伊人欧美| 亚洲一区在线视频| 亚洲国产精品综合| 久久男人av资源网站| 一本在线高清不卡dvd| 国内成+人亚洲| 欧美视频一二三区| 开元免费观看欧美电视剧网站| 一区二区三区视频在线播放| 免费久久久一本精品久久区| 亚洲一区在线免费观看| 最新亚洲一区| 国内精品久久久久影院色| 欧美色网一区二区| 欧美成人在线免费视频| 久久久久99精品国产片| 亚洲一区二区三区视频播放| 欧美xart系列高清| 久久久精品欧美丰满| 亚洲综合欧美| 亚洲小视频在线| 一区二区三区久久精品| 亚洲国产人成综合网站| 国产亚洲综合在线| 国产日韩一区| 国产欧美一二三区| 国产乱码精品一区二区三区av|