2009-09-01 24 views
7

vb.netの数値の絶対値はどのようにして得られますか?vb.netの絶対値

機能が組み込まれていますか?関数を自分で単純に記述することはできますが、最初に関数があるかどうかを知りたいのです。それはとてもシンプルなようですが、私はおそらく3つの行にすることができますので、私は驚くでしょう...

ありがとう!

答えて

16

Math.Abs​​(val)でダウン投票される危険が

MSDN Link

+0

簡単に、ありがとう! – Cyclone

+1

さて、少なくともMSDNリンクには、潜在的なオーバーフローの問題について言及するサブリンクがあります。 – MusiGenesis

+2

ところで、毎日のWTFでのあなたの仕事には、すぐに20Kの評判ボーナスが与えられるべきだと思います。 – MusiGenesis

1

機能がMath.Abs​​

8

で、あなたが応じて、独自の絶対値メソッドを記述することもできますあなたが使っているものについて次のコードスニペット(申し訳ありません、それは、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つの値しかないためです)。残念ながら、オーディオデータ(通常は短い[]配列)を正規化するためにMath.Abs​​を使用するときはいつでもこのエラーに遭遇するので、Math.Abs​​の周りに自分自身のラッパーを書くという習慣を覚えていますこれは私のためだけで、ダブルを返します:

public double AbsThatDoesntSuck(short value) 
{ 
    return Math.Abs((double)value); 
} 

私が扱う必要がある他のどのような種類のオーバーロード。私はMath.Abs​​がこのように動作するように書かれていた理由を理解していますが、それは間違いなく未知のものの後ろを噛むことができます。

+0

Lol、ありがとう、ありがとう!数値が0より小さい場合はチェックを行い、負の数値を掛ける場合は、数値が大きすぎて解析することができない場合は常に動作します。 – Cyclone

+1

+1。落ちることは絶対にありません! – RobS

+0

これはより良いです: 'Return(i/i)* i' – beppe9000