2010-11-19 3 views
6

sprintf 명령을 사용하여 다음에 일어나는 일을 이해할 수 없습니다.MATLAB에서 sprintf로 변수의 소수를 표시

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

>> sprintf('%0.53f', e) 

ans = 

2.71828182845904550000000000000000000000000000000000000 

sprintf 나를 보여 않을 수 e 대신 숫자의 반올림 나는 첫 번째 장소에 보관? 사용자가 만든 변수 e가 약 16 자리입니다 이중의 정밀도로 제한되도록

+0

이것은 질문과는 관계가 없지만 'e'의 진수를 원하면 'vpa ('exp (1) ', 53) 대신 입력해야합니다. – MarkV

+0

@MarkV : 네,하지만 좋아해요. 그것. 고맙습니다! – Peterstone

답변

5

변수, MATLAB의 기본으로 double precision있습니다. 더 많은 자릿수를 입력 했더라도 이중 자릿수는 모든 추가 자릿수를 정확히 나타내는 정밀도가 아니며 가장 가까운 숫자로 반올림됩니다.

편집 :으로 내가 게시 this follow-up question에 그의 대답에 Andrew Janke하여보다 상세하게 설명하면 e에 대해 선택한 숫자는 이진 값의 정확한 소수점 확장 될 일이. 즉, 근처에있는 부동 소수점 숫자를 반올림하여 정확하게 표현할 수있는 값입니다. 그러나이 경우 소수점보다 약 16 자리 이상은 배정도 유형으로 정확하게 표현할 수 없기 때문에 중요하지 않은 것으로 간주됩니다. 따라서 SPRINTF과 같은 함수는이 작은 값을 자동으로 무시하여 대신 0을 출력합니다.

+1

단계를 건너 뜁니다. sprintf를 사용할 때 e는 암시 적으로 double로 변환됩니다. 변수는 ... – Marc

+1

@Marc : 흠? 복사와 붙여 넣기로 인해 리터럴에서 초기화되므로 e는 이미 double입니다. Matlab에서는 모든 숫자 리터럴이 이중 값을 생성합니다. "class (2.7182818284590455348848081484902650117874145507812500)"로 확인하면 'double'을 반환합니다. 클래스 (exp (1))도 double입니다. 표시된 숫자의 대부분은 정확도의 두 배를 넘기 때문에 가짜입니다. vpa()는 printf()처럼 그것들을 0으로 만들지 않습니다. –

+0

네 말이 맞아. 나는 그 코드에서 그것을 놓쳤다. – Marc

관련 문제