0

私のAndroidアプリケーション(オーディオ処理)では、長い型変数を使用して一時停止されている位置を計算しますが、アプリケーションは大きなオーディオファイルに対して奇妙な結果をもたらしました。少し努力した後、Androidの位置計算が限界を超えていることがわかりました。javaのlong型の最小値は-9,223,372,036,854,775,808、最大値は9,223,372,036,854,775,807ですが、なぜ計算が限界を超えたのか疑問に思いました。

いくつかの投稿を読んだ後、AndroidはJavaとは異なり限られた値の範囲をサポートしていることがわかりました。しかし、私の質問は、Androidでこの計算をどのように実行できるかということです。他にAndroid固有のデータ型はありますか?

これは、アプリで実行する計算です。position =((bufferSize * currentPosition)/ duration);

4

2 に答える 2

4

私のコメントで述べたように、あなたがあなたの情報を取得している投稿は単に間違っています。long常に64ビットです。NIOにはいくつかの制限があるかもしれませんが、それは別の問題です。

ただし、問題は簡単に説明できます。これがまたあなたのコードです:

position = (bufferSize * currentPosition) / duration;

bufferSizeあなたはとの種類を言っていませんcurrentPositionが、私はそれらがであると仮定しますlong。非常に大きなバッファと「遅い」currentPosition値がある場合、乗算の結果が負の数にオーバーフローする可能性があります。その負の数をで割ると、負の数duration(ただし大きさは小さい)になります。

bufferSizeおよびcurrentPositionintの代わりに変数である場合long、そのオーバーフローははるかに早く発生します。実際、その場合は、算術演算を64ビットで実行するだけで問題を解決できる可能性があります。

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

バッファサイズに基づいて、これがどの範囲で機能するかを理解する必要currentPositionがあります。正直なところ、適切なサイズのファイル長とバッファサイズの組み合わせで問題ないと思います。

それでも問題が解決しない場合は、変数の種類や観察している値(結果を含むすべての変数)など、詳細情報を投稿してください。

于 2012-05-01T05:59:35.410 に答える
0

@Jon Skeetのように、長さで十分だと思います。ただし、longが十分に大きくない場合は、bufferSizeを1000または100万で除算することを検討できます。ある程度の精度は失われますが、結果はまだ探しているものに近くなります。バッファの「フルネス」は、バイト単位の値ではなく、キロバイト単位またはメガバイト単位で概算されます。

于 2012-05-01T05:57:03.383 に答える