在 Pro*C 中处理浮点数



我有一个 Oracle 表,其中包含 NUMBER 类型的列,其中包含一系列浮点数。 使用 Pro*C 将其读入 C 变量的正确方法是什么我尝试了以下方法:

EXEC SQL BEGIN DECLARE SECTION;
static  float   o_start_x;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT start_x
FROM  my_table
INTO  :o_start_x;

更常见的情况是,这并不好,但是一些浮点数,特别是那些非常接近 0 的数字(例如 1.4E-43)会导致以下错误:

ORA-01426: numeric overflow;

是否有一种正确/安全的方式来读取这样的值,或者一种让 oracle 足够安全地转换类型的方法,从而允许精度损失?

浮点数允许有限的精度 - 双精度通常更多,15位。

需要注意的是:例如,浮点在处理资金时存在问题。示例:.10不能在数据的 IEEE-754 浮点内部表示中精确表示。一种常见的解决方法是让预言机使用 BCD 算法,这样可以避免浮点问题,然后将最终结果读取为双精度值。

FLT_DIG
This is the number of decimal digits of precision for the float data type. Technically, if p and b are the precision and base (respectively) for the representation, then the decimal precision q is the maximum number of decimal digits such that any floating point number with q base 10 digits can be rounded to a floating point number with p base b digits and back again, without change to the q decimal digits.

FLT_DIG通常是精度最小值的六位数,DBL_DIG:15。

只要你避免做大量的数学运算和用C代码进行比较,除非你知道如何处理我提到的问题和其他问题,否则很容易得到一个最终的结果。

EXEC SQL BEGIN DECLARE SECTION;
static  double   o_start_x;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT start_x
FROM  my_table
INTO  :o_start_x;

如果这个数字很大,你可能必须使用字符串。 NUMBER 的精度限制为 32 位,这超出了常见 C 数据类型的精度限制。Pro*C 不支持 bignum 数据类型 AFAIK。

相关内容

  • 没有找到相关文章

最新更新