2010-12-23 6 views
4

아래 예제를 통해 mySQL에서 FLOAT가 어떻게 작동하는지 설명 할 수 있습니까? 저는 플로트가 근사치라는 것을 압니다,하지만 실제로 그러한 차이가 있습니까? 그리고 9 자리 숫자 밖에 없기 때문에 오버플로 문제가 아닙니다. 그렇지 않습니까?mysql에서 float 정밀도 문제가 발생했습니다

mysql> create table t(f FLOAT(15,2), db DOUBLE); 
mysql> insert into t(f,db) VALUES (512659663, 512659663); 
mysql> select * from t; 

+--------------+-----------+ 
| f   | db  | 
+--------------+-----------+ 
| 512659648.00 | 512659663 | 
+--------------+-----------+ 

(MySQL은 14.14 DISTRIB 5.1.44 버전, Win32에서 대한 (IA32) Windows XP에서)

답변

13

FLOAT32이며, 이름에서 알 수 있듯이 부동 소수점입니다. 값이 높을수록 절대 정밀도는 낮아집니다.

512659648은 수십 개의 오류를 일으킬 정도로 큽니다. IEEE-754에서

Update:

(즉 FLOAT 인 기능), 데이터 비트 32에 저장되어 1는 로그인 8 비트 이진 지수 및 유효수 23 비트의 비트.

지수는 가장 가까운 최소 전력 지수 인 2 (귀하의 경우 28 또는 268435456)을 보여줍니다.

유효 숫자는 2 분수입니다. 정확도가 2^-231부터 2까지의 숫자를 저장할 수 있습니다. 귀하의 경우에는 1.11101000111010010000110 또는 ~ 1.9098060 (십진수 표기)입니다.

숫자는 지수와 유효 숫자의 곱으로 계산됩니다.

이 모든 것을 감안할 때, 해당 순서의 수에 대한 정확도는 2^(28 - 23) = 2^5 = 32입니다 (2^28에서 2^29).

+0

근사 오차를 추정 할 수 있습니까? 숫자의 크기에 따라 선형 적으로 달라 지거나 다른 것이 있습니까? –

+0

@ts : 32 비트 IEEE 754 부동 소수점 숫자는 약 7 자리의 정확도를 유지할 수 있습니다. 64 비트 비트는 약 16 진수를 저장할 수 있습니다. 7 자리를 초과하는 것이 문제가 될 것입니다. FLOAT (15,2) 한정자는 효과적인 것보다 더 소원한 생각입니다. (15,2)는 기본적으로 무시됩니다. –

+0

@Jonathan : '2'부분은 더 작은 값으로 간주되고 '15'는 큰 값으로 간주됩니다. – Quassnoi

1

단 정밀도 부동 소수점의 가수는 길이가 22 비트입니다. 따라서 2^22, 4194304보다 큰 정수를 정확하게 저장할 수 없습니다.

+0

IEEE 754는 가수 시작시 묵시적 1 비트를 가지므로 효과적으로 1 비트를 추가합니다. 32 비트 수의 가수에는 부호 비트, 8 비트 지수 및 23 + 1 비트가 있습니다. See : [Wikipedia] (http://en.wikipedia.org/wiki/IEEE_754-2008) 또는 [General Decimal Arithmetic] (http://speleotrove.com/decimal/). –

관련 문제