2010-06-14 76 views
141

Ví dụ: toán tử có tồn tại để xử lý việc này không?Có toán tử số mũ trong C# không?

float Result, Number1, Number2; 

Number1 = 2; 
Number2 = 2; 

Result = Number1 (operator) Number2; 

Trong quá khứ các nhà điều hành ^ đã phục vụ như một nhà điều hành mũ trong các ngôn ngữ khác, nhưng trong C# nó là một nhà điều hành bit-khôn ngoan.

Tôi có phải viết vòng lặp hoặc bao gồm một không gian tên khác để xử lý các hoạt động theo cấp số nhân không? Nếu vậy, làm cách nào để xử lý các hoạt động theo hàm mũ bằng cách sử dụng các số nguyên không?

+7

Nó không phải trong C#, nhưng nhiều ngôn ngữ sử dụng '** 'như nhà điều hành ghi lũy thừa. –

+0

đến đây bởi vì tôi đã miffed rằng 10^7 được lưu trữ trong một dài/Int64 đã cho tôi "13." Tôi đã thử 1E7, nhưng điều đó đã cho tôi một lỗi kiểu. Vì tôi đã không nhìn thấy một lỗi loại/lỗi cú pháp toán tử bất hợp pháp, tôi đã giả định 10^7 của tôi đã hoạt động ... – mpag

Trả lời

167

Ngôn ngữ C# doesn't have a power operator. Tuy nhiên, .NET Framework cung cấp phương thức Math.Pow:

Trả về số được chỉ định được nâng lên công suất đã chỉ định.

Vì vậy, ví dụ bạn sẽ trông như thế này:

float Result, Number1, Number2; 

Number1 = 2; 
Number2 = 2; 

Result = Math.Pow(Number1, Number2); 
+0

Tuyệt vời. Cảm ơn câu trả lời rõ ràng. Tôi đánh giá cao nó. – Charlie

+1

Hãy ghi nhớ hình phạt hiệu suất nếu sử dụng Math.Pow cho bình phương: https://stackoverflow.com/questions/936541/math-pow-vs-multiply-operator-performance#936909 – Justas

28

Có một blog post on MSDN about why an exponent operator does NOT exists từ nhóm C#.

Nó sẽ có thể để thêm một nhà điều hành điện với ngôn ngữ, nhưng thực hiện hoạt động này là một điều khá hiếm làm trong hầu hết các chương trình, và nó dường như không hợp lý để thêm một nhà điều hành khi gọi Math.Pow() là đơn giản.


Bạn hỏi:

Tôi có phải viết một vòng lặp hoặc bao gồm khác namespace để xử lý hoạt động theo cấp số nhân? Nếu vậy, làm thế nào để Tôi xử lý các hoạt động theo hàm mũ bằng cách sử dụng không phải là số nguyên?

Math.Pow hỗ trợ thông số kép nên bạn không cần phải viết thông số của riêng mình.

+0

Tuyệt vời. Cảm ơn! – Charlie

+13

Tôi hiểu đối số, nhưng một lý do hợp lệ sẽ là Math.Pow() không thể được sử dụng để thiết lập các giá trị const, làm cho số mũ không sử dụng được cho tất cả các hằng số. – jsmars

30

Tôi loạng choạng về bài đăng này muốn sử dụng ký hiệu khoa học trong mã của tôi, tôi đã sử dụng

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

Nhưng sau đó tôi phát hiện ra bạn có thể làm

4.95E-10; 

Chỉ cần nghĩ rằng tôi sẽ thêm này cho bất cứ ai trong một tình huống tương tự mà tôi đang ở.

2

Tôi ngạc nhiên không ai đề cập đến điều này, nhưng đối với trường hợp bình phương (và có thể gặp phải nhất), bạn chỉ cần nhân với elf.

float Result, Number1; 

Result = Number1 * Number1; 
+0

của nó không nhân, sức mạnh của nó. – Henry

+0

Có @Henry và như những người khác đã đề cập, một nhà điều hành không tồn tại. Chỉ là 'Math.Pow'. Tôi đã cung cấp một giải pháp rõ ràng cho trường hợp phổ biến nhất. – RubberDuck

+1

Cũng nhanh hơn nhiều so với 'Math.Pow (Số1, 2)' – lamont

0

Kể từ khi không ai vẫn chưa viết một chức năng để làm điều này với hai số nguyên, đây là một cách:

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 

Ngoài ra trong 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 
+0

Ai đó có thể vui lòng giải thích câu trả lời không? Tôi đã thử nghiệm mã này và bạn cũng có thể sử dụng http://ideone.com/o9mmAo (C#) & http://ideone.com/vnaczj (VB.NET) - nó có vẻ hoạt động hoàn hảo. – Nathangrad

+4

Vì có Math.Pow vì vậy mã của bạn là không liên quan – Thaina

+0

Math.Pow() là chậm mặc dù và điều này sẽ được nhanh hơn đáng kể miễn là PowerOf là hợp lý nhỏ. – lamont

1

Việc thiếu toán tử hàm mũ cho C# là một sự khó chịu lớn đối với chúng tôi khi tìm kiếm một ngôn ngữ mới để chuyển đổi phần mềm tính toán của chúng tôi từ vb6 tốt.

Tôi rất vui vì chúng tôi đã đi với C# nhưng nó vẫn làm phiền tôi bất cứ khi nào tôi đang viết một phương trình phức tạp bao gồm cả số mũ. Phương thức Math.Pow() làm cho phương trình khá khó đọc IMO.

giải pháp của chúng tôi là tạo ra một lớp DoubleX đặc biệt mà chúng tôi ghi đè^-operator (xem dưới đây)

này hoạt động khá tốt miễn là bạn khai báo ít nhất một trong các biến như DoubleX:

DoubleX a = 2; 
DoubleX b = 3; 

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

hoặc sử dụng một bộ chuyển đổi rõ ràng trên đôi tiêu chuẩn:

double c = 2; 
double d = 3; 

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

một vấn đề với phương pháp này mặc dù được rằng số mũ được tính trong nhiều thập kỷ thứ tự sai màu đỏ cho các nhà khai thác khác. Điều này có thể tránh được bằng cách luôn đặt thêm() xung quanh các hoạt động mà một lần nữa làm cho nó một chút khó khăn hơn để đọc các phương trình:

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 

Tôi hy vọng điều này có thể giúp đỡ để những người sử dụng rất nhiều các phương trình phức tạp trong mã của họ và có lẽ ai đó thậm chí còn có ý tưởng về cách cải thiện phương pháp này ?! :-)

lớp 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 -------------- 
    } 
}