क्या C # में एक एक्सपोर्टर ऑपरेटर है?


194

उदाहरण के लिए, क्या कोई ऑपरेटर इसे संभालने के लिए मौजूद है?

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Number1 (operator) Number2;

पूर्व में ^ऑपरेटर अन्य भाषाओं में एक घातांक ऑपरेटर के रूप में कार्य करता है, लेकिन C # में यह थोड़ा समझदार ऑपरेटर होता है।

क्या मुझे एक लूप लिखना है या घातीय संचालन को संभालने के लिए एक और नाम स्थान शामिल करना है? यदि हां, तो मैं गैर-पूर्णांक का उपयोग करके घातीय संचालन कैसे संभाल सकता हूं?


7
यह C # में नहीं है, लेकिन कई भाषाएं **इनफिक्स एक्सपोनेंटेशन ऑपरेटर के रूप में उपयोग होती हैं ।
मार्क रुशक्फ

यहाँ आया था क्योंकि मैं miffed था कि 10 ^ 7 एक लंबे / Int64 में संग्रहीत मुझे "13." दे रहा था मैंने 1E7 की भी कोशिश की थी, लेकिन इससे मुझे एक प्रकार की त्रुटि हुई। जैसा कि मुझे एक प्रकार की त्रुटि / अवैध ऑपरेटर सिंटैक्स त्रुटि दिखाई नहीं दे रही थी, मैंने मान लिया था कि मेरा 10 ^ 7 काम कर रहा था ...
MPag

1
@mpag ^ एक्सक्लूसिव या ऑपरेटर है, इसलिए 10 ^ 7 = 1010b XOR 0111b = 1101b = 13.
इयान

जवाबों:


228

C # भाषा में पावर ऑपरेटर नहीं है । हालाँकि, .NET फ्रेमवर्क Math.Pow विधि प्रदान करता है :

निर्दिष्ट शक्ति के लिए उठाए गए एक निर्दिष्ट संख्या देता है।

तो आपका उदाहरण इस तरह दिखेगा:

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Math.Pow(Number1, Number2);

1
यदि निष्पादन का ध्यान रखें तो Math.Pow का उपयोग स्क्वरिंग के लिए करें: stackoverflow.com/questions/936541/…
Justas

4
@Justas मैं अभी परीक्षण कर रहा हूं कि .NET कोर 2.1 और Math.Pow अब सुझाए गए वैकल्पिक कार्यान्वयन से तेज है।
बट्टेदेव

50

मैं अपने कोड में वैज्ञानिक संकेतन का उपयोग करने की तलाश में इस पोस्ट पर ठोकर खाई, मैंने उपयोग किया

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

लेकिन बाद में मुझे पता चला कि तुम कर सकते हो

4.95E-10;

बस मैंने सोचा कि मैं इसी तरह की स्थिति में किसी के लिए भी इसे जोड़ूंगा।


34

MSDN पर एक ब्लॉग पोस्ट है कि एक एक्सपोनेंट ऑपरेटर C # टीम से मौजूद क्यों नहीं है

भाषा के लिए एक पावर ऑपरेटर को जोड़ना संभव होगा, लेकिन अधिकांश कार्यक्रमों में यह ऑपरेशन करना काफी दुर्लभ बात है, और Math.Pow () को कॉल करते समय ऑपरेटर को जोड़ना उचित नहीं लगता है।


तुम ने पूछा था:

क्या मुझे एक लूप लिखना है या घातीय संचालन को संभालने के लिए एक और नाम स्थान शामिल करना है? यदि हां, तो मैं गैर-पूर्णांक का उपयोग करके घातीय संचालन कैसे संभाल सकता हूं?

Math.Pow दोहरे मापदंडों का समर्थन करता है इसलिए आपको अपना लिखने की कोई आवश्यकता नहीं है।


24
मैं तर्क को समझता हूं, लेकिन एक वैध कारण यह होगा कि Math.Pow () का उपयोग कॉन्स्टेंस मान सेट करने के लिए नहीं किया जा सकता है, जो एक्सप्लेंट्स को सभी स्थिरांक के लिए अनुपयोगी बनाता है।
जसमर्स

1
एक पावर ऑपरेटर ऑपरेटर ओवरलोडिंग के लिए सुविधाजनक होगा, मेरे लिए Math.Pow () एक प्रतिपादक ऑपरेटर नहीं बनाने के इस तथ्य को सही नहीं ठहराता है। ।
अलेक्जेंड्रे डेबोरकोर्ट

8

सी # के लिए एक घातांक ऑपरेटर की कमी हमारे लिए एक बड़ी झुंझलाहट थी जब हम अपने गणना सॉफ्टवेयर को अच्छे राजभाषा vb6 से परिवर्तित करने के लिए एक नई भाषा की तलाश कर रहे थे।

मुझे खुशी है कि हम C # के साथ गए, लेकिन यह तब भी मुझे गुस्सा दिलाता है जब भी मैं एक जटिल समीकरण लिख रहा हूं, जिसमें एक्सप्लर्स शामिल हैं। Math.Pow () विधि IMO को पढ़ने के लिए समीकरणों को काफी कठिन बनाता है।

हमारा समाधान एक विशेष डबलएक्स क्लास बनाना था जहां हम ^ -ऑपरेटर (नीचे देखें) को ओवरराइड करते हैं

जब तक आप कम से कम एक चर को डबल एक्स घोषित करते हैं, तब तक यह काफी अच्छा काम करता है:

DoubleX a = 2;
DoubleX b = 3;

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

या मानक डबल्स पर एक स्पष्ट कनवर्टर का उपयोग करें:

double c = 2;
double d = 3;

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

इस पद्धति के साथ एक समस्या यह है कि प्रतिपादक की गणना अन्य ऑपरेटरों की तुलना में गलत क्रम में की जाती है। ऑपरेशन के आसपास हमेशा एक अतिरिक्त () लगाने से बचा जा सकता है जो समीकरणों को पढ़ने के लिए फिर से थोड़ा कठिन बनाता है:

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

मुझे आशा है कि यह उन लोगों के लिए मदद कर सकता है जो अपने कोड में बहुत सारे जटिल समीकरणों का उपयोग करते हैं, और शायद किसी को भी इस पद्धति का सुधार करने का विचार है? :-)

डबलएक्स क्लास:

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 --------------
    }
}

2

मुझे आश्चर्य है कि किसी ने भी इसका उल्लेख नहीं किया है, लेकिन स्क्वेरिंग के सरल (और शायद सबसे अधिक सामना करने वाले) मामले के लिए, आप बस खुद से गुणा करें।

float Result, Number1;

Result = Number1 * Number1;

4
इसका गुणन नहीं, इसकी शक्ति।
हेनरी

हां @ हेनरी और जैसा कि दूसरों ने उल्लेख किया है, एक ऑपरेटर मौजूद नहीं है। बस Math.Pow। मैं सिर्फ सबसे आम मामले का एक स्पष्ट समाधान पेश कर रहा था।
रबरडुक

4
इससे भी ज्यादा तेजMath.Pow(Number1, 2)
lamont

2

चूंकि किसी ने अभी तक दो पूर्णांक के साथ ऐसा करने के लिए एक फ़ंक्शन नहीं लिखा है, यहां एक तरीका है:

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

किसी को कृपया नीचे की व्याख्या कर सकते हैं? मैंने इस कोड का परीक्षण किया है और आप ideone.com/o9mmAo (C #) और ideone.com/vnaczj (VB.NET) पर भी कर सकते हैं - यह पूरी तरह से अच्छी तरह से काम करता है।
नथांग्राद

8
क्योंकि Math.Pow हैं इसलिए आपका कोड अप्रासंगिक है
Thaina

1
Math.Pow () धीमा है और जब तक पॉवरऑफ यथोचित रूप से छोटा है तब तक यह काफी तेजी से होगा।
lamont

3
@ (नाथगढ़) पहिया को फिर से बदलना (प्रति वर्ग) काफी हद तक एक विरोधी पैटर्न माना जाता है। FYI करें: अपवाद
नोटफाउंड.net/…

इसके अलावा, thre अपनी स्वयं की पावर विधि को लागू करने के लिए तेज़ तरीके हैं। देखें: en.wikipedia.org/wiki/Exponentiation_by_squaring
जेसी चिशोल्म

0

एक अच्छा पावर फंक्शन होगा

    public long Power(int number, int power) {
        if (number == 0) return 0;
        long t = number;
        int e = power;
        int result = 1;
        for(i=0; i<sizeof(int); i++) {
            if (e & 1 == 1) result *= t;
            e >>= 1;
            if (e==0) break;
            t = t * t;
        }
    }

`Math.Pow` फ़ंक्शन प्रोसेसर पावर फ़ंक्शन का उपयोग करता है और अत्यधिक कुशल है।


0

द्विआधारी स्थिरांक को परिभाषित करने के लिए 2 की शक्ति बढ़ाते समय मैं इसके लायक हूं कि मुझे ^ ऑपरेटर की याद आती है। वहां Math.Pow () का उपयोग नहीं किया जा सकता है, लेकिन घातांक के मूल्य कार्यों द्वारा 1 के एक अहस्ताक्षरित int को शिफ्ट करना। जब मुझे (2 ^ 24) -1 के एक निरंतर को परिभाषित करने की आवश्यकता थी:

public static int Phase_count = 24;
public static uint PatternDecimal_Max = ((uint)1 << Phase_count) - 1;

याद रखें कि प्रकार (uint) << (int) होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.