web-dev-qa-db-ja.com

C#に指数演算子はありますか?

たとえば、これを処理するための演算子は存在しますか?

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Number1 (operator) Number2;

過去に^演算子は他の言語で指数演算子として機能していましたが、C#ではビット単位の演算子です。

指数演算を処理するためにループを記述するか、別の名前空間を含める必要がありますか?もしそうなら、非整数を使用して指数演算をどのように処理しますか?

164
Charlie

C#言語 パワー演算子はありません 。ただし、.NET Frameworkは Math.Pow メソッドを提供します。

指定した数値を指定した累乗で返します。

したがって、例は次のようになります。

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Math.Pow(Number1, Number2);
197
dtb

私はコードで科学表記法を使用しようとしてこの投稿を見つけました

4.95*Math.Pow(10,-10);

しかし、その後、私はあなたができることがわかりました

4.95E-10;

私がこれと同じような状況にある人のためにこれを追加すると思った。

42
General Grey

C#チームから 指数演算子が存在しない理由に関するMSDNのブログ投稿 があります。

言語にパワーオペレータを追加することは可能ですが、この操作を実行することはほとんどのプログラムで行うことはかなりまれであり、 Math.Pow を呼び出すときにオペレータを追加することは正当化されていないようです。 =()は簡単です。


あなたが尋ねた:

指数演算を処理するためにループを記述するか、別の名前空間を含める必要がありますか?もしそうなら、非整数を使用して指数演算をどのように処理しますか?

Math.Powはダブルパラメーターをサポートしているため、独自のパラメーターを記述する必要はありません。

31
Brian R. Bondy

C#の指数演算子がないことは、計算ソフトウェアを優れたol 'vb6から新しい言語に変換するために新しい言語を探しているとき、私たちにとって大きな悩みの種でした。

C#を使用して良かったのですが、指数を含む複雑な方程式を作成するたびに悩まされます。 Math.Pow()メソッドは、方程式をIMOの読み取りを非常に困難にします。

私たちの解決策は、^-operatorをオーバーライドする特別なDoubleXクラスを作成することでした(以下を参照)

これは、少なくとも1つの変数をDoubleXとして宣言する限り、かなり機能します。

DoubleX a = 2;
DoubleX b = 3;

Console.WriteLine($"a = {a}, b = {b}, a^b = {a ^ b}");

または、標準のdoubleで明示的なコンバーターを使用します。

double c = 2;
double d = 3;

Console.WriteLine($"c = {c}, d = {d}, c^d = {c ^ (DoubleX)d}");     // Need explicit converter

ただし、この方法の1つの問題は、指数が他の演算子と比較して間違った順序で計算されることです。これは、演算の周りに常に余分な()を置くことで回避できます。これにより、方程式の読み取りが少し難しくなります。

DoubleX a = 2;
DoubleX b = 3;

Console.WriteLine($"a = {a}, b = {b}, 3+a^b = {3 + a ^ b}");        // Wrong result
Console.WriteLine($"a = {a}, b = {b}, 3+a^b = {3 + (a ^ b)}");      // Correct result

これがコードで多くの複雑な方程式を使用する他の人の助けになることを願っています。誰かがこの方法を改善する方法のアイデアさえ持っているかもしれません。 :-)

DoubleXクラス:

using System;

namespace ExponentialOperator
{
    /// <summary>
    /// Double class that uses ^ as exponential operator
    /// </summary>
    public class DoubleX
    {
        #region ---------------- Fields ----------------

        private readonly double _value;

        #endregion ------------- Fields ----------------

        #region -------------- Properties --------------

        public double Value
        {
            get { return _value; }
        }

        #endregion ----------- Properties --------------

        #region ------------- Constructors -------------

        public DoubleX(double value)
        {
            _value = value;
        }

        public DoubleX(int value)
        {
            _value = Convert.ToDouble(value);
        }

        #endregion ---------- Constructors -------------

        #region --------------- Methods ----------------

        public override string ToString()
        {
            return _value.ToString();
        }

        #endregion ------------ Methods ----------------

        #region -------------- Operators ---------------

        // Change the ^ operator to be used for exponents.

        public static DoubleX operator ^(DoubleX value, DoubleX exponent)
        {
            return Math.Pow(value, exponent);
        }

        public static DoubleX operator ^(DoubleX value, double exponent)
        {
            return Math.Pow(value, exponent);
        }

        public static DoubleX operator ^(double value, DoubleX exponent)
        {
            return Math.Pow(value, exponent);
        }

        public static DoubleX operator ^(DoubleX value, int exponent)
        {
            return Math.Pow(value, exponent);
        }

        #endregion ----------- Operators ---------------

        #region -------------- Converters --------------

        // Allow implicit convertion

        public static implicit operator DoubleX(double value)
        {
            return new DoubleX(value);
        }

        public static implicit operator DoubleX(int value)
        {
            return new DoubleX(value);
        }

        public static implicit operator Double(DoubleX value)
        {
            return value._value;
        }

        #endregion ----------- Converters --------------
    }
}
5
Petter

誰もこれについて言及していないことに驚いていますが、単純な(そしておそらく最も遭遇する)二乗の場合、あなたはそれ自体を掛けます。

float Result, Number1;

Result = Number1 * Number1;
2
RubberDuck

2つの整数でこれを行う関数を誰もまだ書いていないので、ここに1つの方法があります。

private long CalculatePower(int Number, int PowerOf) {
    long Result = Number;    
    for (int i = PowerOf; i > 1; i--) {
        Result = (Result * Number);
    }
    return Result;
}
CalculatePower(5, 3); // 125
CalculatePower(8, 4); // 4096
CalculatePower(6, 2); // 36

または、VB.NETの場合:

Private Function CalculatePower(Number As Integer, PowerOf As Integer) As Long
    Dim Result As Long = Number
    For i As Integer = PowerOf To 2 Step -1
        Result = (Result * Number)
    Next
    Return Result
End Function
CalculatePower(5, 3) ' 125
CalculatePower(8, 4) ' 4096
CalculatePower(6, 2) ' 36
1
Nathangrad