ORACLE 數字演算法的C語言實現
先來研究NUMBER型別的數字回推演算法
型別 <[長度]>,符號/指數位 [數字1,數字2,數字3,......,數字20]
1、長度型別沒什麼號說的
2、符號位,這個需要說一下
The sign bit, which is the high order bit (128)
按照文件的說法這個判斷方法是和128進行最高位按位與出來的,如果
這位小於128則是負數,我們使用127試試吧
128的二進位制為1000 0000
127的二進位制為0111 1111
最高位1&0=0 則代表他是負數,
如果是129則是正數
128的二進位制為1000 0000
129的二進位制為1000 0001
最高位1&1=1 則代表他是正數,
3、指數位
正數
128固定為正負數的判斷
65固定 The offset, which is always 65
那麼就是128+65=193就是正數指數的固定數值
負數
固定為62為負數的固定數值
4、數字位
正數
那我們來判斷這樣一個數字
193,64,13,31
那麼就是
193-193=0
(64-1)*100^(0-0) =63
(13-1)*100^(0-1) =0.12
(31-1)*100^(0-2) =0.0030
為63.123
負數
62,38,89,71,102
62-62=0
101-38 = 63 *100^(0-0)=63
101-89 = 12 *100^(0-1)=0.12
101-71 = 30 *100^(0-2)=0.003
102 為排序位不用理會
所以為-63.123
研究了數字的演算法接下來我們使用C語言進行實現
考慮實際的16進位制格式
4,c1,40,d,1f 63.123
5,3e,26,59,47,66 -63.123
04,c1,40,0d,1f,05,3e,26,59,47,66
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
struct bin1b
{
unsigned a1:1;
unsigned a2:1;
unsigned a3:1;
unsigned a4:1;
unsigned a5:1;
unsigned a6:1;
unsigned a7:1;
unsigned a8:1;
};
void main()
{
int sseek=8182;//設定偏移量後期可以直接推算出來
int clg,digt,i;
double a=0.0;
char clgc;
char *Ptr;
int *Ptrn;
struct bin1b *data;
FILE *fp;
fp=fopen("D:\\c\\95393.dbf","rb");
if(!fp)
{
printf("can't open this file!");
}
else
{
fseek(fp,sseek+1,0);
fread(&clgc,1,1,fp);
printf("%d\n",ftell(fp));
clg=clgc;
Ptr=(char *)malloc(clg); //分配欄位長度的一個4個單位元組記憶體空間
Ptrn=(int *)malloc(sizeof(int)*clg);
fread(Ptr,1,clg,fp);
printf("%d\n",ftell(fp));
for(i=0;i<clg;i++)
{
data=&Ptr[i];
Ptrn[i]=data->a1+data->a2*2+data->a3*pow(2,2)+data->a4*pow(2,3)+data->a5*pow(2,4)+data->a6*pow(2,5)+data->a7*pow(2,6)+data->a8*pow(2,7);
printf("%d\n",Ptrn[i]);
}
for(i=0;i<clg;i++)
{
if(Ptrn[0]<128)
{
digt=62-Ptrn[0];
if((i>0) && (Ptrn[i]!=102))
{
a=a+(101-Ptrn[i])*pow(100,(digt-(i-1)));
}
}
if(Ptrn[0]>128)
{
digt=Ptrn[0]-193;
if(i>0 )
{
a=a+(Ptrn[i]-1)*pow(100,(digt-(i-1)));
}
}
}
if(Ptrn[0]<128)
{
printf("%lf\n",-a);
}
else
{
printf("%lf\n",a);
}
free(Ptr);
free(Ptrn);
}
fclose(fp);
}
型別 <[長度]>,符號/指數位 [數字1,數字2,數字3,......,數字20]
1、長度型別沒什麼號說的
2、符號位,這個需要說一下
The sign bit, which is the high order bit (128)
按照文件的說法這個判斷方法是和128進行最高位按位與出來的,如果
這位小於128則是負數,我們使用127試試吧
128的二進位制為1000 0000
127的二進位制為0111 1111
最高位1&0=0 則代表他是負數,
如果是129則是正數
128的二進位制為1000 0000
129的二進位制為1000 0001
最高位1&1=1 則代表他是正數,
3、指數位
正數
128固定為正負數的判斷
65固定 The offset, which is always 65
那麼就是128+65=193就是正數指數的固定數值
負數
固定為62為負數的固定數值
4、數字位
正數
那我們來判斷這樣一個數字
193,64,13,31
那麼就是
193-193=0
(64-1)*100^(0-0) =63
(13-1)*100^(0-1) =0.12
(31-1)*100^(0-2) =0.0030
為63.123
負數
62,38,89,71,102
62-62=0
101-38 = 63 *100^(0-0)=63
101-89 = 12 *100^(0-1)=0.12
101-71 = 30 *100^(0-2)=0.003
102 為排序位不用理會
所以為-63.123
研究了數字的演算法接下來我們使用C語言進行實現
考慮實際的16進位制格式
4,c1,40,d,1f 63.123
5,3e,26,59,47,66 -63.123
04,c1,40,0d,1f,05,3e,26,59,47,66
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
struct bin1b
{
unsigned a1:1;
unsigned a2:1;
unsigned a3:1;
unsigned a4:1;
unsigned a5:1;
unsigned a6:1;
unsigned a7:1;
unsigned a8:1;
};
void main()
{
int sseek=8182;//設定偏移量後期可以直接推算出來
int clg,digt,i;
double a=0.0;
char clgc;
char *Ptr;
int *Ptrn;
struct bin1b *data;
FILE *fp;
fp=fopen("D:\\c\\95393.dbf","rb");
if(!fp)
{
printf("can't open this file!");
}
else
{
fseek(fp,sseek+1,0);
fread(&clgc,1,1,fp);
printf("%d\n",ftell(fp));
clg=clgc;
Ptr=(char *)malloc(clg); //分配欄位長度的一個4個單位元組記憶體空間
Ptrn=(int *)malloc(sizeof(int)*clg);
fread(Ptr,1,clg,fp);
printf("%d\n",ftell(fp));
for(i=0;i<clg;i++)
{
data=&Ptr[i];
Ptrn[i]=data->a1+data->a2*2+data->a3*pow(2,2)+data->a4*pow(2,3)+data->a5*pow(2,4)+data->a6*pow(2,5)+data->a7*pow(2,6)+data->a8*pow(2,7);
printf("%d\n",Ptrn[i]);
}
for(i=0;i<clg;i++)
{
if(Ptrn[0]<128)
{
digt=62-Ptrn[0];
if((i>0) && (Ptrn[i]!=102))
{
a=a+(101-Ptrn[i])*pow(100,(digt-(i-1)));
}
}
if(Ptrn[0]>128)
{
digt=Ptrn[0]-193;
if(i>0 )
{
a=a+(Ptrn[i]-1)*pow(100,(digt-(i-1)));
}
}
}
if(Ptrn[0]<128)
{
printf("%lf\n",-a);
}
else
{
printf("%lf\n",a);
}
free(Ptr);
free(Ptrn);
}
fclose(fp);
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-1821766/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 排序演算法-C語言實現排序演算法C語言
- C語言實現A*演算法薦C語言演算法
- C語言,實現數字譜到簡譜的轉換(二)C語言
- PID演算法的C語言實現演算法C語言
- 快速排序演算法(C語言實現)排序演算法C語言
- C語言預設引數值的實現C語言
- c語言字串,數字轉換C語言字串
- 基於落點打分的井字棋智慧下棋演算法(C語言實現)演算法C語言
- 經典排序演算法的 C語言 | Java 實現排序演算法C語言Java
- 位反轉的最佳演算法(C語言實現)演算法C語言
- 複數的四則運算(C語言實現)C語言
- C語言實現九大排序演算法C語言排序演算法
- C語言怎麼實現可變引數C語言
- 用C語言實現八數碼問題C語言
- C語言“字串-數字”之間的轉換C語言字串
- 演算法導論C語言實現: 演算法基礎演算法C語言
- C 語言隨機數生成器的實現分析隨機
- 掃雷--C語言實現C語言
- C語言實現DES加密C語言加密
- c語言實現階乘C語言
- C語言實現的一個簡單的猜數小遊戲C語言遊戲
- c語言遞迴函式實現求最大公約數(Euclid演算法)C語言遞迴函式演算法
- 【作業系統】銀行家演算法實現(C語言)作業系統演算法C語言
- 數字訊號處理c語言程式集C語言
- PAT Basic 1057. 數零壹(20)(C語言實現)C語言
- 如何使用Python語言實現計數排序演算法?Python排序演算法
- C語言實現,計算兩天之間相差的天數C語言
- C語言實現TCP通訊C語言TCP
- 高精度加法(C語言實現)C語言
- c語言實現this指標效果C語言指標
- C語言實現順序表C語言
- C語言實現連結串列C語言
- 漢諾塔(hanoi) C語言實現C語言
- RTree原始碼——C語言實現原始碼C語言
- C語言實現出入棧操作C語言
- C語言實現檔案加密C語言加密
- 資料結構與演算法分析(c 語言描述)基數排序 陣列實現資料結構演算法排序陣列
- 利用棧實現佇列(C語言實現)佇列C語言