programing

Oracle Floats 대

topblog 2023. 6. 22. 21:24
반응형

Oracle Floats 대

오라클 문서에서 서로 모순되는 언급이 보입니다.소수점 이하를 플로트에 저장하는 방법과 데이터베이스의 NUMBER 유형 사이에 차이점이 있습니까?

제가 C, et al.로부터 기억하듯이, 플로트는 인트가 가지지 않는 정확도 제한을 가지고 있습니다. R.g. '플로트'의 경우, 0.1(베이스 10)은 0.1100110011001100110011001100101(베이스 2)로 대략 0.10000000149011611938476525(베이스 10)와 같습니다.그러나 'int'의 경우 5(기준값 10)는 정확히 101(기준값 2)입니다.

이것이 다음이 C에서 예상대로 종료되지 않는 이유는 다음과 같습니다.

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

그러나 Oracle 문서의 다른 부분에서는 FLOAT가 숫자로 정의되어 있음을 알 수 있습니다.그리고 제가 알기로는 오라클의 NUMBER 유형 구현은 C의 float과 같은 문제에 부딪히지 않습니다.

자, 여기서 진짜 이야기는 무엇입니까?Oracle이 Floats/FLOATs에서 발생할 것으로 예상되는 표준을 벗어났습니까?

(내가 그것들을 무엇에 사용할 것인지에 대한 차이는 분명하지만, 나는 0.1*10이 1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

오라의BINARY_FLOAT에서는 C 및 다른 많은 언어와 같이 IEEE 754 부동 소수점 표현을 사용하여 데이터를 내부에 저장합니다.데이터베이스에서 가져와 호스트 언어로 IEEE 754 데이터 유형에 저장하면 값을 변환하지 않고 복사할 수 있습니다.

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

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

예를 들어 BINARY_DOUBLE은 9바이트의 스토리지를 사용하지만 IEEE는 8바이트의 스토리지를 사용합니다.또한 이중 부동 숫자 -3.0은 3F-F7-FF-FF-FF-FF로 표시되며, 실제 IEEE를 사용할 경우 C0-08-00-00-00-00-00-00이 됩니다.Oracle 표현에서 비트 63은 0이고 IEEE 표현에서는 1입니다(IEEE에 따르면 's'가 부호 비트인 경우 숫자의 부호는 -1)^s입니다).http://babbage.cs.qc.cuny.edu/IEEE-754/ 에서 매우 우수한 IEEE 754 계산기를 확인하십시오.

테이블 T에 다음과 같은 쿼리가 있는 BINARY__DOUBLE 열 BD가 있으면 쉽게 찾을 수 있습니다.

T에서 BD, DUMP(BD) 선택

이 모든 것이 괜찮고 흥미롭지만 C에서 작업하고 Oracle에서 숫자 값을 얻을 때(변수를 모든 종류의 숫자 열에 바인딩하여) 일반적으로 C에서 지원하는 실제 IEEE 이중으로 결과를 얻습니다.이제 이 값은 일반적인 IEEE 부정확성의 영향을 받습니다.

정확한 연산을 수행하려면 PL/SQL 또는 특수 정밀 산술 C 라이브러리를 사용하여 수행할 수 있습니다.

숫자 데이터 유형에 대한 Oracle 자체 설명은 http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/datatype.htm#i16209 를 참조하십시오.

Oracle의 숫자는 사실 소수점(10진수) 부동 소수점 표시입니다.Float는 Number의 별칭일 뿐이며 동일한 작업을 수행합니다.

Binary(base-2) float을 사용하려면 Oracle의 BINARY_FLOAT 또는 BINARY_DOUBLE 데이터 유형을 사용해야 합니다.

링크 텍스트

Oracle의 FLOOT에 대한 Bill의 답변은 최신 버전(예: 11i)에만 정확합니다. Oracle 8i에서 문서는 다음과 같이 말합니다.

"번호 데이터 유형"에서 설명한 형식으로 부동 소수점 번호를 지정할 수 있습니다.Oracle은 ANSI 데이터 유형 FLOAT도 지원합니다.다음 구문 형식 중 하나를 사용하여 이 데이터 유형을 지정할 수 있습니다.

FLOAT는 소수점 정밀도 38 또는 2진수 정밀도 126으로 부동 소수점 번호를 지정합니다. FLOAT(b)는 2진수 정밀도 b로 부동 소수점 번호를 지정합니다.정밀도 b의 범위는 1 ~ 126입니다.2진수에서 10진수 정밀도로 변환하려면 b에 0.30103을 곱합니다.십진수에서 이항 정밀도로 변환하려면 십진수 정밀도에 3.32193을 곱합니다.이진 정밀도의 최대 126자리는 대략 십진수 정밀도의 38자리와 같습니다.

쿼드러플 정밀도(126 이진 정밀도)처럼 들립니다.제가 잘못 알고 있는 것이 아니라면, IEEE754는 단일 정밀도의 경우 b = 2, p = 24, 이중 정밀도의 경우 p = 53만 필요합니다.Oracle과 Postgre 간의 전환 계획을 검토할 때 8i와 11i의 차이로 인해 많은 혼란이 발생했습니다.SQL.

앞에서 언급한 PLS_INTEGER와 마찬가지로 Oracle 10g의 BINARY_FLOAT 및 BINARY_DOUBLE 유형은 기계 산술을 사용하고 더 적은 스토리지 공간을 필요로 하며, 이는 모두 NUMBER 유형보다 효율적입니다.

  • BINARY_FLOAT 및 BINARY_DOUBLE만 NAN 값을 지원합니다.

-정확한 계산이 아님

언급URL : https://stackoverflow.com/questions/332492/oracle-floats-vs-number

반응형