別の番号に番号の符号を付す?

数字の符号(正または負)をとり、それを別の数字に付与する簡潔な方法を探しています。

For example:

2つの数字が与えられています。最初の数字は1で、2番目の数字は実行時まで不明です。
不明な数が0未満の場合、私たちの数は-1になります。
未知の数が0以上の場合、私たちの数は1になります。

未知数がXの場合:


enter image description here

コードとして:

int before = 1;
int X = rand(Int32.Min, Int32.Max);
int after = ...

私は個人的にC#4.5を使用していますが、良い解決策はかなり言語にとらわれないと信じています。

これを行う方法はいくつか考えられますが、いずれもif-else-caseステートメントまたは3項演算子を使用します。数学的なやり方が欲しいのですが。

1
nl ru de
未知数がゼロになったらどうなりますか?
追加された 著者 Rufus L,
@RufusLは、規則に従って、 1 になります。
追加された 著者 Flydog57,
@RufusLは、規則に従って、 1 になります。
追加された 著者 Flydog57,
私はあなたの三項嫌悪を理解していません。 (X <0)のような式? -1:1 は、朝食時にはほとんどコードなしにコンパイルされます(アセンブリ言語では、このような比較が行われます(そして、1または-1に設定されます))。
追加された 著者 Flydog57,

4 答え

var after = X/Math.Abs(X);

数値をそれ自体で除算すると1が得られ、絶対値でそれをすると符号が変化しないことが保証されます。 0の場合はここでは扱われないことに注意してください(0で割らないでください)。おそらくそのためのif文または三項が必要です。

OPは彼のセットに0から-0.01までの数字がないので、除算が0の問題を解決することができる前に0.00001のような小さい数をXに加えることを注意します。

また、他の答え/コメントが述べたように、ここでの三項への嫌悪は奇妙です。単純な分岐代入は、加算や除算よりもずっと安価です。

2
追加された
@ Flydog57どうやらここではXをイプシロンにすることはできません。ルーファス...それはおそらく本当ですが、少なくともそれは本当の数学演算子です:D
追加された 著者 BradleyDotNET,
@Dylan Xが-.0000001Fのとき何が起こりますか? :)
追加された 著者 BradleyDotNET,
@ディランああ、それでは確かに。そのような小さな増分を追加することは問題ないでしょう
追加された 著者 BradleyDotNET,
Math.Abs​​if ステートメントも使用しますが、...:D
追加された 著者 Rufus L,
X ==(-1 * yourEpsilon)の場合は、試してみてください。 @Dylanなので、上記のコード( rand 関数を使用)は実際には自分の持っているものではなく、データソースから取得したデータがあります。そのソースにノイズがないことを願います(または、試してみてください/キャッチしてください)。
追加された 著者 Flydog57,
しかし、私の言っていることは、データが0.01の増分であるため、0または-.01のどちらかになります。あなたの心配は別のデータセットで存在するでしょう。
追加された 著者 Dylan,
私が扱っているデータは100分の1なので、私の計算は符号を取得するだけでよく、100分の1以上の精度である必要はありません。
追加された 著者 Dylan,
純粋に数学的なやり方を探しているのなら(私はこれです)。私はあなたがXにごく小さいフロートを前もって追加することによって、あなたが0を扱うことができると信じます。 X + = .000001F など
追加された 著者 Dylan,
すばらしいです!ありがとう、私はこれを考えていませんでした!
追加された 著者 Dylan,
var after = (X < 0) ? -1 : 1;

それは部門よりも安いです、それはあなたの意図に関してもより明確です

2
追加された
@Dylan> =は<�の反対です、彼はすでにあなたの質問の出力と一致させています
追加された 著者 BradleyDotNET,
三項が許されるならば、私はこれで行きます。 OPは具体的には数学関数を求めた
追加された 著者 BradleyDotNET,
それは簡単に関数(あるいは Func )かもしれません
追加された 著者 Flydog57,
私もこれが好きです、それはまたXが0であることを扱います。
追加された 著者 Dylan,
ああ、私はそれを誤解しました。あなたの右。
追加された 著者 Dylan,

何故なの:

var after = Math.Sign(x)*before;
1
追加された
0を入力して0を返します。 > docs.microsoft.com/ja-jp/dotnet/api/… また。不正行為;)
追加された 著者 BradleyDotNET,
Math.Signif ステートメントを使用します。 :)
追加された 著者 Rufus L,
@ RufusL LOL:P ..
追加された 著者 Dylan,
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();

            const int before = 1;

            int x = rnd.Next(int.MinValue, int.MaxValue);

            int after = x == 0 ? 1 : before * (x/Math.Abs(x));

            Console.ReadKey();
        }
    }
}
0
追加された
同意しましたが、 before はOPに存在しますが、不明な理由
追加された 著者 BradleyDotNET,
ええと、 before はconst 1 です。オプティマイザはあなたのアイデンティティーによる掛け算を無視するでしょう。
追加された 著者 Flydog57,