ORACLE NUMBER类型内部实现

简介: 先来研究NUMBER类型的数字回推算法 类型 ,符号/指数位 [数字1,数字2,数字3,......,数字20] 1、长度类型没什么号说的 2、符号位,这个需要说一下 The sign bit, which is the high order bit (128...
先来研究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
早期我写过一个C语言程序使用位域来完成,因为有点久远了我也不太记得是否验证过不过先放到这里

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>



  4. double number(int sseek)
  5. {
  6.     struct bin1b
  7.     {
  8.         unsigned a1:1;
  9.         unsigned a2:1;
  10.         unsigned a3:1;
  11.         unsigned a4:1;
  12.         unsigned a5:1;
  13.         unsigned a6:1;
  14.         unsigned a7:1;
  15.         unsigned a8:1;
  16.     };
  17.     int sseek=8182;//设置偏移量后期可以直接推算出来
  18.     int clg,digt,i;
  19.     double a=0.0;
  20.     char clgc;
  21.     char *Ptr;
  22.     int *Ptrn;
  23.     struct bin1b *data;
  24.     FILE *fp;
  25.     fp=fopen("D:\\c\\95393.dbf","rb");
  26.     if(!fp)
  27.     {
  28.         printf("can't open this file!");
  29.     }
  30.     else
  31.     {
  32.         fseek(fp,sseek+1,0);
  33.         fread(&clgc,1,1,fp);
  34.         printf("%d\n",ftell(fp));
  35.         clg=clgc;
  36.         Ptr=(char *)malloc(clg); //分配字段长度的一个4个单字节内存空间
  37.         Ptrn=(int *)malloc(sizeof(int)*clg);
  38.         fread(Ptr,1,clg,fp);
  39.         printf("%d\n",ftell(fp));
  40.         for(i=0;i<clg;i++)
  41.         {
  42.             data=&Ptr[i];
  43.             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);
  44.             printf("%d\n",Ptrn[i]);
  45.         }
  46.         
  47.         for(i=0;i<clg;i++)
  48.         {
  49.             if(Ptrn[0]<128)
  50.             {
  51.                 digt=62-Ptrn[0];
  52.                 if((i>0) && (Ptrn[i]!=102))
  53.                 {
  54.                     a=a+(101-Ptrn[i])*pow(100,(digt-(i-1)));
  55.                 }
  56.             }
  57.             if(Ptrn[0]>128)
  58.             {
  59.                 digt=Ptrn[0]-193;
  60.                 if(i>0 )
  61.                 {
  62.                     a=a+(Ptrn[i]-1)*pow(100,(digt-(i-1)));
  63.                 }
  64.             }
  65.         }
  66.         if(Ptrn[0]<128)
  67.         {
  68.             a=-a;
  69.         }
  70.         else
  71.         {
  72.             a=a;
  73.         }
  74.         
  75.          return(a);
  76.         free(Ptr);
  77.          free(Ptrn);
  78.     }
  79.     fclose(fp);
  80. }



相关文章
|
2月前
|
存储 Java Apache
Python Number类型详解!
本文详细介绍了 Python 中的数字类型,包括整数(int)、浮点数(float)和复数(complex),并通过示例展示了各种算术操作及其类型转换方法。Python 的 `int` 类型支持任意大小的整数,`float` 类型用于表示实数,而 `complex` 类型用于表示复数。此外,文章还对比了 Python 和 Java 在数字类型处理上的区别,如整数类型、浮点数类型、复数类型及高精度类型,并介绍了各自类型转换的方法。尽管两种语言在语法上有所差异,但其底层逻辑是相通的。通过本文,读者可以更好地理解 Python 的数字类型及其应用场景。
65 2
|
5月前
|
存储 Oracle 关系型数据库
|
4月前
|
分布式计算 Oracle 关系型数据库
实时计算 Flink版产品使用问题之获取Oracle的数据时无法获取clob类型的数据,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
SQL Oracle 关系型数据库
关系型数据库Oracle备份类型
【7月更文挑战第18天】
69 2
|
6月前
|
SQL 数据采集 Oracle
实时计算 Flink版产品使用问题之如何读取oracle中的blob类型的数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
TS,类型注解 number就是类型注解,TS类型注解是一种为变量添加类型约束的方式,你定义什么类型,就只能赋值什么类型,变量命名规则,变量名称不能以数字开头,交换变量写法
TS,类型注解 number就是类型注解,TS类型注解是一种为变量添加类型约束的方式,你定义什么类型,就只能赋值什么类型,变量命名规则,变量名称不能以数字开头,交换变量写法
|
7月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
171 0
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
|
7月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在 DataWorks 中,使用Oracle作为数据源进行数据映射和查询,如何更改数据源为MaxCompute或其他类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
78 1

推荐镜像

更多