2017-11-24 2 views
-2

은 값이 약간 수정 : 나는 np.float64으로 숫자를 캐스팅 할 때np.float32가 매트릭스의 값을 약간 변경하는 이유는 무엇입니까? 내가 <code>np.float32</code>로 매트릭스의 숫자를 캐스팅 할 때

그러나
In [1]: matrix_32 = np.asarray([ 
    ...: [0.7, 3], 
    ...: [1.7, 2], 
    ...: [0.7, 9] 
    ...: ], dtype=np.float32) 

In [2]: matrix_32 
Out[2]: 
array([[ 0.69999999, 3.  ], 
     [ 1.70000005, 2.  ], 
     [ 0.69999999, 9.  ]], dtype=float32) 

이 값이 예상대로 표시됩니다 :

In [3]: matrix_64 = np.asarray([ 
    ...: [0.7, 3], 
    ...: [1.7, 2], 
    ...: [0.7, 9] 
    ...: ], dtype=np.float64) 

In [4]: matrix_64 
Out[4]: 
array([[ 0.7, 3. ], 
     [ 1.7, 2. ], 
     [ 0.7, 9. ]]) 

누군가가 수 이것이 일어나는 이유를 설명해주십시오.

+1

부동 소수점 산술에 대한 소개를 읽어 보시기 바랍니다. https://en.wikipedia.org/wiki/Floating-point_arithmetic –

+0

이 질문은 소개 된 부정확성뿐만 아니라'np.float32'와'np.float64'가 다른'__repr__'을 가지고있는 것처럼 보입니다 객체에 대한 구현. –

+1

몇 가지 기본 부동 소수점 속성에 대한 지식으로 쉽게 대답 할 수있는 많은 부동 소수점 질문을 얻었지만 질문을 중복으로 표시하면 해당 질문이 정확한 중복임을 의미합니다. 답변을 제공하지 않고 광범위한 범주의 질문을 빗나가게하는 데 사용해서는 안됩니다. 이 질문은 [원래 의도 한 것] (https://stackoverflow.com/questions/588004/is-floating-point-math-broken)과 중복되지 않습니다. –

답변

3

10 진수를 2 진 부동 소수점으로 변환 할 때는 10 진수 대신 2 진수로 반올림해야합니다. 이 반올림은 값을 변경합니다. float32의 경우 변경 사항은 Numpy가 사용하는 출력 형식을 볼 수있을만큼 충분히 큽니다. float64의 경우 변경 사항이 너무 작아서 볼 수 없습니다.

표시 할 얼간이 샘플은 8 자리 10 진수 또는 9 자리 유효 숫자를 사용하는 것으로 보입니다. 정상적인 float32 값의 경우 소수점에서의 변환으로 인해 발생하는 변경 사항은 변환되는 값의 약 0.00000003 배 (그리고 두 배의 크기)가되므로 9 자리의 유효 자릿수로 표시됩니다. 보통의 float64 값의 경우 소수점의 변환으로 인한 변경은 값의 .0000000000000001 (10-16) 배 정도되는 경향이 있으므로 9 자릿수로 표시하기에는 너무 작습니다.

정상 float32 값의 경우 변경 사항은 16,777,216 개에서 1 부분만큼 커질 수 있습니다. 정상적인 float64 값의 경우 변경 사항은 9,007199254740,992에서 1 부분만큼 커질 수 있습니다. 이것은 십진수에서 이진 부동 소수점으로의 초기 변환을위한 것입니다. 산술 (정확한 수학적 결과가 부동 소수점 형식에 적합한 값으로 반올림 됨) 및 표시를 위해 숫자가 십진수로 다시 변환 될 때 추가 라운딩이있을 수 있습니다. (정상 범위를 벗어나면 매우 큰 수는 무한대로 오버플로 될 수 있습니다. 따라서 변경 사항은 무한합니다. 매우 작은 수는 더 조잡하게 반올림됩니다. 심지어 가장 작은 수는 0으로 변경되기 때문에 100 %까지 변경됩니다.)

+1

기록을 위해 NumPy의 출력은 파이썬이 아닌 여기 관련이 있습니다. NumPy는 자체 float32 및 float64 유형을 가지고 있습니다. 유형은 Python의 내장 'float'유형에 대한 문자열 표현과는 별도로 고유 한 문자열 표현을 사용합니다. 배열을 인쇄 할 때 NumPy는 고정 된 정밀도로 반올림됩니다. 나는 그것이 기본적으로 8 자리 유효 숫자라고 생각한다. –

+0

@ MarkDickinson : 감사합니다. –

관련 문제