たとえば、これを処理するための演算子は存在しますか?
float Result, Number1, Number2;
Number1 = 2;
Number2 = 2;
Result = Number1 (operator) Number2;
過去に ^
他の言語では指数演算子として機能していましたが、C#ではビット単位の演算子です。
指数演算を処理するためにループを作成するか、別の名前空間を含める必要がありますか?もしそうなら、非整数を使用して指数演算をどのように処理しますか?
たとえば、これを処理するための演算子は存在しますか?
float Result, Number1, Number2;
Number1 = 2;
Number2 = 2;
Result = Number1 (operator) Number2;
過去に ^
他の言語では指数演算子として機能していましたが、C#ではビット単位の演算子です。
指数演算を処理するためにループを作成するか、別の名前空間を含める必要がありますか?もしそうなら、非整数を使用して指数演算をどのように処理しますか?
回答:
C#言語にはパワー演算子がありません。ただし、.NET FrameworkはMath.Powメソッドを提供します。
指定された指数で指定された数を返します。
したがって、例は次のようになります。
float Result, Number1, Number2;
Number1 = 2;
Number2 = 2;
Result = Math.Pow(Number1, Number2);
MSDNには、C#チームの指数演算子が存在しない理由に関するブログ投稿があります。
言語にパワー演算子を追加することは可能ですが、この操作を実行することはほとんどのプログラムで行うことはかなりまれなことであり、Math.Pow()を呼び出すときに演算子を追加することは簡単ではありません。
あなたは尋ねました:
指数演算を処理するためにループを作成するか、別の名前空間を含める必要がありますか?もしそうなら、非整数を使用して指数演算をどのように処理しますか?
Math.Powは二重パラメーターをサポートしているため、独自にパラメーターを作成する必要はありません。
C#の指数演算子がないことは、計算ソフトウェアを優れたol 'vb6から変換するための新しい言語を探す際に、私たちにとって大きな不満でした。
C#を使用して良かったと思いますが、指数を含む複雑な方程式を書いているときはいつでもイライラします。Math.Pow()メソッドは、IMOを読みにくくする方程式を作成します。
私たちの解決策は、^演算子をオーバーライドする特別な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 --------------
}
}
誰もこれについて言及していないことに驚いていますが、二乗の単純な(そしておそらく最も遭遇する)ケースでは、あなたはそれ自体で乗算します。
float Result, Number1;
Result = Number1 * Number1;
Math.Pow
。私は、最も一般的なケースに対する明白な解決策を提供しているだけでした。
Math.Pow(Number1, 2)
まだ2つの整数でこれを行う関数を書いた人はいないので、ここに1つの方法があります。
private long CalculatePower(int number, int powerOf)
{
for (int i = powerOf; i > 1; i--)
number *= number;
return number;
}
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
For i As Integer = powerOf To 2 Step -1
number *= number
Next
Return number
End Function
CalculatePower(5, 3) ' 125
CalculatePower(8, 4) ' 4096
CalculatePower(6, 2) ' 36
2の定数を定義するために2の累乗を上げると、^演算子を見逃してしまいます。そこでMath.Pow()を使用することはできませんが、符号なし整数の1を指数の値だけ左にシフトすると機能します。(2 ^ 24)-1の定数を定義する必要がある場合:
public static int Phase_count = 24;
public static uint PatternDecimal_Max = ((uint)1 << Phase_count) - 1;
タイプは(uint)<<(int)でなければならないことに注意してください。
**
が中置指数演算子として使用されています。