2008-12-01 6 views
11

Oracles documentation에 충돌하는 참조가 표시됩니다. 10 진수가 FLOAT에 저장되는 방식과 NUMBER 유형이 데이터베이스에 저장되는 방식간에 차이가 있습니까?오라클 수레 대 숫자

C에서 비롯된 것처럼 float에는 int에없는 정확도 제한이 있습니다. 예를 들어 'float'의 경우 0.1 (Base 10)은 대략 0.100000001490116119384765625 (Base 10)와 같은 대략 0.110011001100110011001101 (Base 2)로 근사됩니다. 그러나 int의 경우 5 (Base 10)는 정확히 101 (Base 2)입니다.

float i; 
i = 0; 
for (i=0; i != 10;) 
{ 
    i += 0.1 
} 

을 내가 숫자로 정의 된 플로트 elsewhere in Oracle's documentation를 참조하지만 : C에서 예상대로 다음 종료되지 않습니다 왜

. 그리고 제가 이해 하듯이, 오라클의 NUMBER 유형 구현은 C 플로트와 동일한 문제를 일으키지 않습니다.

그럼 실제 이야기는 무엇입니까? 오라클은 float/FLOATs에서 발생할 것으로 예상되는 표준에서 벗어 났습니까?

(나는 그들을 사용하고있는 것에 대해 차이점이있을 것이라고 확신하지만, 0.1 * 10이 1.00000000000000001로 나오면 질문 할 것입니다.)

답변

22

오라클의 BINARY_FLOAT 저장 데이터는 않습니다. 데이터베이스에서 가져 와서 일반적으로 호스트 언어로 IEEE 754 데이터 유형에 저장하면 변환하지 않고 값을 복사 할 수 있습니다.

오라클의 FLOAT 데이터 유형은 ANSI SQL NUMERIC 데이터 유형의 동의어이며 Oracle에서는 NUMBER라고합니다. 이것은 정확한 숫자이며 IEEE 754의 반올림 동작이없는 소수점 이하 자릿수 데이터 유형입니다. 그러나 데이터베이스에서이 값을 가져 와서 C 또는 Java float에 넣으면이 단계에서 정밀도가 떨어질 수 있습니다.

3

오라클의 숫자는 실제로 10 진수 (10 진수) 부동 소수점 표현입니다. Float은 Number의 별칭이며 똑같은 작업을 수행합니다.

2 진수 (2 진수) 부동 소수점을 사용하려면 Oracle의 BINARY_FLOAT 또는 BINARY_DOUBLE 데이터 유형을 사용해야합니다. 내부적으로 C와 같은 IEEE 754 부동 소수점 표현, 그리고 다른 많은 언어를 사용

link text

10

Oracle BINARY_FLOAT 및 BINARY_DOUBLE은 대부분 IEEE 754 표준과 동일하지만 표준 IEEE 754 표현에 내부적으로 저장되지 않습니다.

예를 들어, BINARY_DOUBLE은 IEEE 8보다 9 바이트의 저장 공간을 사용합니다. 또한 이중 부동 소수점 -3.0은 3F-F7-FF-FF-FF-FF-FF-FF로 표시됩니다. 실제 IEEE C0-08-00-00-00-00-00-00 것입니다. 비트 63은 IEEE 표현식에서 0이지만 IEEE의 경우 1입니다 ('s'가 부호 비트 인 경우, IEEE에 따르면 숫자의 부호는 (-1)^s 임).쿼리와 테이블 T의 BINARY__DOUBLE 열 BD가있는 경우는 쉽게 찾을 수 http://babbage.cs.qc.cuny.edu/IEEE-754/

에 아주 좋은 IEEE 754 계산기를 참조하십시오

선택 BD, DUMP (BD) T

에서

이제는 그 모든 것이 훌륭하고 흥미로 우며 (어쩌면), C에서 작동하고 (모든 종류의 숫자 열에 변수를 바인딩하여) 오라클로부터 숫자 값을 얻으면 일반적으로 실제 IEEE에서 결과를 얻습니다 이 값은 보통 IEEE의 모든 부정확성에 영향을받습니다.

정확한 산술 연산을 원할 경우 PL/SQL 또는 특수 정밀 산술 C 라이브러리를 사용하여 수행 할 수 있습니다. 그들의 숫자 데이터 유형 오라클의 자신의 설명은

은 다음을 참조하십시오 http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/datatype.htm#i16209

2

오라클의 FLOAT에 대한 빌의 대답은 후반 버전 만 올 (11i가 말), 오라클 8i를에서 문서를 말한다 :

부동 소수점 숫자는 "NUMBER Datatype"에서 설명한 양식으로 지정할 수 있습니다. Oracle은 ANSI 데이터 유형 FLOAT도 지원합니다.

FLOAT는 126 FLOAT (b)는 진 정밀 B와 부동 소수점 수를 지정 소수점 정밀도 (38), 또는 이진 정밀도 부동 소수점 수를 지정합니다 : 당신은 이 구문 형태 중 하나를 사용하여이 데이터 유형을 지정할 수 있습니다 . 정밀도 b의 범위는 1 - 126입니다. 을 2 진수에서 10 진수 정밀도로 변환하려면 b에 0.30103을 곱하십시오. 을 십진수에서 이진수로 변환하려면 십진수 의 정밀도에 3.32193을 곱합니다. 최대 126 자릿수의 이진 정밀도는 이며 십진법 정밀도의 38 자리와 대략 동일합니다.

4 배 정밀도 (126 진수 정밀도)처럼 들립니다. 내가 잘못 본 게 아니라면, IEEE754는 b = 2, 단 정밀도의 경우 p = 24, 배정 밀도의 경우 p = 53 만 필요합니다. 8i와 11i의 차이점은 오라클과 PostgreSQL 간의 전환 계획을 검토 할 때 많은 혼란을 야기했습니다.

2
, 이전에 BINARY_FLOAT와 Oracle 10g 사용 기계 산술 BINARY_DOUBLE 유형을 언급 PLS_INTEGER처럼

하고 둘은

  • 만 BINARY_FLOAT과 BINARY_DOUBLE가 NAN을 지원하는 번호 유형과 그들을 더 효율적으로, 더 적은 저장 공간을 필요로

값 - 하지 정확한 계산을