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

隨筆-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>
            久久综合久久综合九色| 亚洲福利视频一区| 国产日本欧美一区二区| 国产精品久久久久久亚洲调教 | 欧美成人69| 蜜臀久久久99精品久久久久久| 久久se精品一区二区| 久久久久久久网| 欧美国产日韩在线| 一本色道久久综合亚洲91 | 欧美福利视频网站| 欧美午夜免费电影| 国产私拍一区| 91久久在线视频| 亚洲在线一区二区| 久久综合中文色婷婷| 亚洲欧洲中文日韩久久av乱码| 亚洲精品乱码久久久久久| 亚洲一区二区三区中文字幕 | 久久精品亚洲一区二区| 麻豆国产精品一区二区三区| 欧美日韩欧美一区二区| 黄色一区三区| 亚洲欧美综合另类中字| 欧美激情网站在线观看| 亚洲午夜激情网站| 欧美高清视频一区| 国内精品嫩模av私拍在线观看 | 欧美在线视频一区| 欧美区一区二区三区| 国产主播精品在线| 99国产精品久久久久老师| 久久精品国产亚洲精品| 日韩一区二区福利| 欧美3dxxxxhd| 一区福利视频| 久久久www成人免费精品| 日韩午夜激情电影| 欧美高清不卡在线| 亚洲人成亚洲人成在线观看图片| 久久精品在线观看| 亚洲欧美精品suv| 国产精品国产三级国产专区53| 亚洲精品中文字幕在线观看| 免费中文字幕日韩欧美| 久久成年人视频| 国产一区二区0| 久久精品官网| 久久国产加勒比精品无码| 国产精品免费观看视频| 亚洲深夜福利网站| 亚洲裸体俱乐部裸体舞表演av| 女女同性精品视频| 亚洲日本国产| 久久在线91| 亚洲国产欧美国产综合一区| 久久久久久久久久久久久久一区 | 欧美国产日韩亚洲一区| 在线视频观看日韩| 欧美大片在线观看一区| 久热爱精品视频线路一| 亚洲电影第1页| 欧美成人一区二区| 欧美二区在线观看| 亚洲精品在线一区二区| 亚洲精品日韩在线| 欧美色播在线播放| 亚洲欧美日韩中文视频| 亚洲女同同性videoxma| 国产亚洲a∨片在线观看| 久久九九99| 蜜桃精品一区二区三区 | 免费成人在线观看视频| 久久久久久久91| 亚洲日韩视频| 亚洲图片激情小说| 黄色成人精品网站| 亚洲国产欧美一区二区三区同亚洲 | 一区二区欧美日韩| 亚洲视频电影图片偷拍一区| 国产精品―色哟哟| 久色成人在线| 美女精品一区| 亚洲一区二区免费视频| 午夜亚洲性色视频| 亚洲高清一区二| 亚洲日本一区二区三区| 国产精品黄色在线观看| 久久伊人亚洲| 欧美视频一区二区在线观看| 久久国产精品电影| 欧美极品在线播放| 久久精品夜夜夜夜久久| 欧美精品久久久久久久久老牛影院| 午夜精品福利一区二区蜜股av| 久久综合给合| 欧美在线免费看| 欧美另类变人与禽xxxxx| 久久久噜噜噜久久人人看| 欧美日韩视频专区在线播放 | 一本大道久久精品懂色aⅴ| 国产一区日韩一区| 亚洲毛片在线观看| 亚洲电影一级黄| 亚洲综合色婷婷| 亚洲精品乱码久久久久久| 亚洲欧美日韩国产综合| 久久亚洲精品网站| av72成人在线| 国产精品网站在线| 欧美激情性爽国产精品17p| 欧美日韩亚洲一区二| 亚洲一区二区三区免费视频| 欧美尤物巨大精品爽| 亚洲伦理在线| 欧美伊久线香蕉线新在线| 亚洲精品视频一区二区三区| 欧美亚洲免费电影| 亚洲少妇一区| 欧美高清在线播放| 久久精品亚洲热| 欧美日韩福利视频| 亚洲国产精品v| 欧美日韩ab| 欧美国产先锋| 一区久久精品| 亚洲欧美日韩一区二区| 亚洲国产mv| 久久久久久自在自线| 久久久久久久一区二区三区| 国产精品黄色在线观看| 夜夜嗨网站十八久久| 一本色道久久综合亚洲精品小说| 美女主播精品视频一二三四| 麻豆av一区二区三区久久| 韩国欧美一区| 久久国产欧美日韩精品| 久久漫画官网| 一区在线免费| 久久综合色88| 亚洲国产成人高清精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产欧美一区二区三区久久人妖| 99re在线精品| 99精品国产在热久久婷婷| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日韩二区三区| 亚洲久久一区二区| 中文欧美字幕免费| 国产精品久久久久一区| 性久久久久久久久久久久| 久久国内精品视频| 国产伊人精品| 免费日韩av电影| 亚洲免费在线观看| 国产亚洲欧美一区二区三区| 亚洲欧美一区二区激情| 久久国产主播| 亚洲啪啪91| 欧美手机在线| 久久9热精品视频| 欧美高清在线| 亚洲天堂av高清| 国产一区二区三区四区五区美女 | 亚洲视频精品| 国产一区二区三区精品欧美日韩一区二区三区 | 午夜在线观看欧美| 欧美福利一区| 亚洲欧美在线播放| 在线色欧美三级视频| 欧美日韩国产麻豆| 性感少妇一区| 亚洲精品欧美日韩| 久久久久久久999精品视频| 亚洲精品中文字幕在线| 国产欧美va欧美va香蕉在| 免费欧美视频| 欧美在线播放视频| 99天天综合性| 欧美高清在线视频观看不卡| 亚洲欧美精品在线观看| 亚洲福利视频网站| 国产精品女主播在线观看| 老鸭窝毛片一区二区三区 | 亚洲毛片播放| 免费高清在线一区| 午夜伦理片一区| 亚洲伦理中文字幕| 伊人精品视频| 国产农村妇女精品一二区| 欧美精品久久99| 久久久蜜桃精品| 亚洲欧美视频在线| av成人免费观看| 亚洲黄色在线观看| 另类专区欧美制服同性| 欧美影院久久久| 亚洲欧美国产视频| 亚洲四色影视在线观看| 亚洲免费观看高清完整版在线观看熊|