10

絶対値を見つけようとして、「〜」などで符号を反転する簡単な方法があると思いました。

4

8 に答える 8

22
float newValue = oldValue * -1;

また

float newValue = -(oldValue); //() aren't needed, I just use them out of habit
于 2010-01-08T05:53:24.383 に答える
13

符号を反転するには、その前にマイナスを付けます。

于 2010-01-08T05:53:14.960 に答える
12

動作による単純な否定-ですが、ほとんどの回答は、OPが絶対値を実行しようとしているという事実を無視しています。そのための正しいツールはabs()、整数とfabs()浮動小数点数用です。コードは非常に明確になり、結果は期待どおりになります。(編集:これらのツールのドキュメントとバグを必ず読んでください。ニックが指摘しているように、最も負の数をで否定するとabs()、同じ負の数が返されます。)

于 2010-01-08T06:19:15.457 に答える
8

単項否定演算子-(expr)は、まさにあなたが望むことをします。

int x = -7;
int y = 7;
x = -x; // x is now 7
y = -y; // y is now -7

~(expr)一方、あなたが言及したビット単位の補数演算子は、入力のすべてのビットを反転します。

それが役立つ場合、野生の多くの絶対値の実装が無視する1つの問題は、特定の固定サイズの2の補数整数型の最も負の値を否定するとオーバーフローすることです。

于 2010-01-08T06:01:02.433 に答える
4

-xは、xの符号が反転した値を示します。

于 2010-01-08T05:53:37.740 に答える
4

トリッキーなテーマ。浮動小数点数の符号を変更する直接的な方法は、変数の最上位ビットの値を反転することです。他の回答にリストされている表記法は、コンパイラーに翻弄されます。これは通常は問題ありませんが、常にそうであるとは限りません。「floatx」の場合、答えは次のとおりです。

*(unsigned int*)&x ^= (1<<31)

Cortex A8プロセッサ(またはそのようなもの)を搭載したiPhoneのようなものを作成する場合は、内部ループでfloatを操作するときに、doubleを回避し、条件文も回避する必要があります。だから、あなたはこれを行うことができます:

*(unsigned int*)&x ^= ( (x<0) << 31 );

これは、分岐命令を使用せずに負から正に変わります。これが内部ループにある場合、iPhoneで別の方法を使用するよりも5〜20倍高速になります。それが内側のループにない場合は、おそらくあまり気にしないでしょう!

于 2010-10-04T21:43:33.353 に答える
1

x = 0-x;

?または私はポイントを逃しますか?

于 2010-01-08T05:53:48.483 に答える
-1

これはくだらない解決策であり、ここで何が起こったのかわかりません。正しいものについては、abs()を使用して以下の回答を参照してください。

これは古い質問ですが、おそらくこの答えはあなたの何人かを助けるでしょう。別の結果(ブール値のmustBeNegativeとしましょう)に基づいて、数値の正または負の値を取得したかったのですが、これを行った方法は次のとおりです。

int number = 7;
if(mustBeNegative)
{
      number = number * 1;
}
else
{
      number = number * -1;
}

数値は、「mustBeNegative」値に基づく正または負の値になります。数がすでに負の数であった場合、それは正になり、その逆も同様です。

于 2013-10-20T14:51:35.683 に答える