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

隨筆-162  評(píng)論-223  文章-30  trackbacks-0
存儲(chǔ)格式
   Oracle Number數(shù)據(jù)類型是變長(zhǎng)的,占0~22字節(jié),不像編程語(yǔ)言中的2/4字節(jié)整數(shù)或4/8字節(jié)浮點(diǎn)數(shù),關(guān)于它的存儲(chǔ)格式與解析,DSI上有詳細(xì)的描述,如下所示
             
   
   符號(hào)位/指數(shù)字節(jié)描述如下
            
   
   數(shù)字字節(jié)描述如下
            
   
   正數(shù)或零值的計(jì)算
            
   
   負(fù)數(shù)值的計(jì)算
            

解析實(shí)現(xiàn)
   由于Oracle Number的精度高達(dá)38位,遠(yuǎn)超出了基本定長(zhǎng)整數(shù)或浮點(diǎn)數(shù)表達(dá)的數(shù)值范圍,因此解析實(shí)際上是大整數(shù)/實(shí)數(shù)的四則運(yùn)算,為避免造輪子,本文使用了GMP開(kāi)源庫(kù)(https://gmplib.org/),用于任意精度的算術(shù)運(yùn)算,操作有符號(hào)整數(shù)、有理數(shù)和浮點(diǎn)數(shù),除了在GMP機(jī)器上運(yùn)行的可用內(nèi)存所暗示的精度之外,對(duì)精度沒(méi)有實(shí)際的限制。解析實(shí)現(xiàn)的核心函數(shù)是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 }

測(cè)試用例
   測(cè)試了123456.789、-123456.789、Oracle Number實(shí)際最大最小值、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 春秋十二月 閱讀(963) 評(píng)論(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>
            欧美在线免费观看亚洲| 亚洲综合精品自拍| 国产精品视频免费一区| 蜜臀久久久99精品久久久久久 | 亚洲国产精品va在线观看黑人 | 免费久久精品视频| 欧美电影美腿模特1979在线看| 亚洲高清成人| 中文av字幕一区| 久久高清免费观看| 欧美喷水视频| 国产精品女主播一区二区三区| 国内精品久久久久影院薰衣草| 亚洲欧洲精品一区二区三区 | 美日韩精品视频| 日韩五码在线| 久久久国产一区二区| 欧美日韩不卡| 韩日在线一区| 亚洲在线观看免费视频| 免费成人小视频| 亚洲午夜在线观看| 欧美不卡在线视频| 激情国产一区二区| 午夜精品在线| 最新成人av网站| 久久激情综合网| 国产精品日韩久久久久| 亚洲精品美女在线观看| 久久美女性网| 亚洲视屏一区| 欧美日韩国产首页| 亚洲精华国产欧美| 久久人人爽人人爽| 亚洲愉拍自拍另类高清精品| 欧美黄网免费在线观看| 在线观看福利一区| 久久久www成人免费毛片麻豆| 日韩一区二区福利| 欧美国产日本韩| 亚洲大胆人体视频| 久久久噜噜噜久久中文字幕色伊伊| 99视频+国产日韩欧美| 欧美黄在线观看| 亚洲精品日韩综合观看成人91| 久久人91精品久久久久久不卡| 亚洲视频高清| 国产精品播放| 亚洲免费在线观看| 亚洲午夜在线视频| 国产欧美精品日韩区二区麻豆天美| 亚洲影视在线播放| 中日韩高清电影网| 国产精品任我爽爆在线播放 | 欧美ab在线视频| 中文欧美字幕免费| 最新日韩在线视频| 欧美高潮视频| 91久久香蕉国产日韩欧美9色 | 亚洲三级免费电影| 老妇喷水一区二区三区| 国内精品美女av在线播放| 久久亚洲精品一区| 久久婷婷久久| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲激情欧美激情| 欧美黄色网络| 亚洲尤物视频网| 亚洲欧美日韩电影| 激情综合网激情| 亚洲国产精品v| 欧美日韩在线一二三| 亚洲欧美日本日韩| 欧美尤物巨大精品爽| 亚洲国产精品专区久久| 亚洲全黄一级网站| 国产精品视频一二三| 久久一区精品| 欧美日韩精品系列| 久久精品国产亚洲一区二区| 久久久久久一区| 夜夜嗨av一区二区三区网站四季av| 99国产精品视频免费观看| 国产精品网站一区| 欧美国内亚洲| 国产精品亚洲综合一区在线观看| 久久人人97超碰国产公开结果 | 一区二区三区国产精华| 亚洲小说春色综合另类电影| 国产日韩欧美亚洲| 欧美黄色aaaa| 国产精品久久久久久妇女6080| 久久综合九色九九| 欧美亚韩一区| 欧美福利网址| 国产美女精品视频| 免费影视亚洲| 国产精品日韩精品欧美精品| 久久综合网络一区二区| 欧美日韩亚洲综合在线| 久久一区国产| 国产日本精品| 亚洲毛片在线观看.| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品免费区二区三区观看| 久久久久免费视频| 欧美另类99xxxxx| 免费中文字幕日韩欧美| 国产精品av一区二区| 欧美激情精品久久久久久变态| 国产精品日本| 一区二区三区精密机械公司 | 最近中文字幕日韩精品| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲天堂久久| 亚洲一区二区三区乱码aⅴ| 欧美成人蜜桃| 亚洲第一中文字幕| 亚洲福利视频网| 久久精品国产免费看久久精品| 亚洲欧美www| 欧美视频免费看| 亚洲精品一区二区三区99| 亚洲大胆人体视频| 久久青草福利网站| 美日韩精品免费| 黄色国产精品| 久久久99久久精品女同性| 久久亚洲国产精品日日av夜夜| 国产日韩专区| 久久国产精品99国产精| 久久久久99精品国产片| 韩国女主播一区二区三区| 午夜日韩电影| 久久久久国产精品人| 国内成人自拍视频| 久久国产精品第一页| 欧美不卡视频| 亚洲美女视频网| 欧美高清影院| 亚洲人成网站999久久久综合| 亚洲裸体视频| 欧美无砖砖区免费| 亚洲欧美激情四射在线日| 久久经典综合| 亚洲国产欧洲综合997久久| 欧美激情欧美狂野欧美精品| 日韩视频在线一区二区三区| 亚洲——在线| 韩国av一区二区三区在线观看| 亚洲一区二区三区免费视频| 欧美日韩伦理在线| 亚洲一区二区精品在线| 久久都是精品| 亚洲国产精品va| 欧美日本国产一区| 亚洲欧美日韩在线不卡| 女同性一区二区三区人了人一| 99国产精品久久久久老师| 国产精品免费区二区三区观看| 久久精品人人做人人综合 | 亚洲第一精品夜夜躁人人爽| 在线精品一区二区| 裸体一区二区| 一本综合精品| 麻豆精品精品国产自在97香蕉| 亚洲欧洲日本专区| 国产精品二区在线观看| 久久福利资源站| 一本大道久久精品懂色aⅴ| 久久精品主播| 中国成人在线视频| 精品69视频一区二区三区| 欧美激情综合在线| 欧美在线观看网站| 99国产精品国产精品久久| 久久国产精品网站| 日韩一区二区精品视频| 国产亚洲网站| 欧美涩涩视频| 久久综合网色—综合色88| 亚洲一二三区在线观看| 欧美激情精品久久久六区热门 | 亚洲一区在线免费| 1024成人| 国产欧美日韩在线播放| 欧美高清在线视频观看不卡| 香蕉免费一区二区三区在线观看 | 欧美在线综合视频| 夜夜嗨av一区二区三区网站四季av| 国产在线播精品第三| 国产精品久久久91| 欧美日韩国产电影| 欧美77777| 久久一区亚洲| 久久久久.com| 久久裸体艺术| 久久亚洲不卡| 久久久久久色| 久久另类ts人妖一区二区|