vb.netで数値の絶対値を取得するにはどうすればよいですか?
機能は内蔵されていますか?自分で関数を簡単にコーディングできることは知っていますが、最初に関数がすでに存在するかどうかを知りたいです。とてもシンプルなようで、たぶん3行で作れるので、1行ないとびっくりします…。
ありがとう!
vb.netで数値の絶対値を取得するにはどうすればよいですか?
機能は内蔵されていますか?自分で関数を簡単にコーディングできることは知っていますが、最初に関数がすでに存在するかどうかを知りたいです。とてもシンプルなようで、たぶん3行で作れるので、1行ないとびっくりします…。
ありがとう!
Math.Abs(val)
反対票を投じられるリスクがありますが、使用目的に応じて、独自の絶対値メソッドを作成することをお勧めします。次のコードスニペット(C#で申し訳ありませんが、同じ原則が適用されます):
short i = -32768;
int iAbs = Math.Abs(i);
は正常にコンパイルされますが、実行すると、2行目でOverflowExceptionがスローされ、「2の補数の最小値を否定することは無効です」という有用なメッセージが表示されます。この場合、iはタイプshortであるため、コンパイラはshortを受け入れてshortを返すMath.Absのオーバーロードを選択し、+ 32768は有効なshortではないため、予期していたとしても、メソッドは例外をスローします。 iAbsをintにすることでこの問題を解決します。
このスニペット:
short i = -32768;
int iAbs = Math.Abs((int)i);
例外なくコンパイルおよび実行されますが、この方法でコーディングするのはちょっと不格好です。私の意見では、これは非常に卑劣なエラーです。これは、現実の世界ではめったに発生しないためです(この例外を生成するタイプごとに値が1つしかないため)。残念ながら、オーディオデータ(通常はshort []配列)を正規化するためにMath.Absを使用するたびにこのエラーが発生するため、すべてを処理するMath.Absの周りに独自のラッパーを作成する習慣があります。これは私にとってはダブルを返します:
public double AbsThatDoesntSuck(short value)
{
return Math.Abs((double)value);
}
私が処理する必要がある他のタイプのオーバーロードで。Math.Absがこのように動作するように作成された理由は理解できますが、気付かないうちに確実に背後を食いつぶす可能性があります。
Math.Absを使用します。
関数はMath.Absです。