1

浮動小数点数の範囲を含む NUMBER 型の列を持つ Oracle テーブルがあります。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;

そのような値を読み取る正しい/安全な方法、またはオラクルに型を安全に変換させて精度の低下を許容する方法はありますか?

4

1 に答える 1

2

float は限られた精度を許容します - double はより多く、通常は 15 桁です。

警告: 浮動小数点は、たとえば、お金を扱うときに問題があります。例:.10データの IEEE-754 浮動小数点内部表現では正確に表現できません。一般的な回避策は、オラクルに BCD 演算を使用させて浮動小数点の問題を回避し、最終結果を double に読み込むことです。

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 は通常、最小精度で 6 桁、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 データ型をサポートしていません。

于 2013-10-14T12:23:44.603 に答える