2012-05-01 2 views
0

내 안드로이드 응용 프로그램 (오디오 처리)에서 긴 형식의 변수를 사용하여 일시 중지되는 위치를 계산하지만 응용 프로그램이 큰 오디오 파일에 이상한 결과를주었습니다. 약간의 노력을 쏟은 후에 나는 위치 계산이 안드로이드의 한도에서 벗어나는 것을 발견했습니다. 자바의 long 타입은 최소값이 -9,223,372,036854775808이고 최대 값이 9,223,372,036854775807이지만, 필자의 계산이 한계를 벗어난 이유가 궁금합니다.android의 기본 데이터 유형의 값 한도

posts을 살펴본 후 Java와 달리 안드로이드가 제한된 값 범위를 찾았습니다. 하지만 내 질문에 내가 어떻게 안드로이드 에서이 계산을 수행 할 수 있습니까? 다른 안드로이드 특정 데이터 유형이 있습니까?

이것은 내 앱에서 수행하는 계산입니다. position = ((bufferSize * currentPosition)/duration);

+3

해당 게시물의 대답이 잘못되었습니다. 직접 시도해보십시오 - 당신은 분명히 한계까지 '긴'을 사용할 수 있습니다. –

답변

4

내 의견에 언급했듯이, 정보를 가져 오는 게시물은 단순히 잘못되었습니다. long은 항상 64 비트입니다. NIO에는 몇 가지 제한 사항이있을 수 있지만 이는 다른 문제입니다.

그러나 문제는 어떤 속임수없이 쉽게 설명 될 수 있습니다. 여기에 코드를 다시입니다 :

position = (bufferSize * currentPosition)/duration; 

당신은 bufferSizecurrentPosition의 유형이 무엇인지 말했다하지 않은,하지만 나는 그들이 long있어 가정합니다. 매우 큰 버퍼와 "늦은"currentPosition 값이있는 경우 곱셈의 결과가 음수로 오버플로 될 가능성이 있습니다. 해당 음수를 duration으로 나눌 때 음수 (그러나 크기는 더 작음) 번호가 표시됩니다. bufferSizecurrentPosition 대신 longint 변수 인 경우

, 오버 플로우가 훨씬 더 빨리 발생합니다. 그런 경우 실제로, 당신은 잘 방금 64 비트에서 수행 할 연산을 강제로 문제를 해결할 수 있습니다

position = ((long)bufferSize * currentPosition)/duration; 

당신은이까지 일하는 것이 currentPosition 어떤 범위 밖으로 작동합니다, 귀하의 버퍼 크기를 기반으로 - 나는 정직하기 위해 어떤 현명한 파일 크기와 버퍼 크기 조합에도 괜찮을 것으로 기대합니다.

그래도 도움이되지 않는다면, 변수 유형 및 관찰중인 값 (결과를 포함한 모든 변수)을 포함한 자세한 정보를 게시하십시오.

+0

bufferSize, currentPosition 및 duration은 모두 int 유형입니다. –

+0

위의, 위치 = ((long) bufferSize * currentPosition)/duration, 여전히 다른 값을 제공합니다. –

+0

@ user1219456 : 'int'라고 생각 하나? (정수형과 같은 타입은 없습니다.) 그렇다면 완벽한 의미를 갖습니다 - 곱셈은 2^31 장벽을 넘기고 범람합니다. –

0

@ 존 스키켓처럼, 나는 길다면 충분하다고 생각합니다. 그러나 long이 충분하지 않은 경우 bufferSize를 천 또는 백만으로 나누는 것을 고려할 수 있습니다. 정밀도가 떨어지지 만 결과가 여전히 원하는 값에 가까울 수 있습니다. 즉, 버퍼의 "충만도"를 바이트로 표시된 값 대신 킬로바이트 또는 메가 바이트 단위로 계산합니다.