সি # তে কোনও এক্সপোনেন্ট অপারেটর আছে কি?


194

উদাহরণস্বরূপ, এটি পরিচালনা করার জন্য কোনও অপারেটর উপস্থিত রয়েছে কি?

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Number1 (operator) Number2;

অতীতে ^অপারেটর অন্যান্য ভাষায় ক্ষতিকারক অপারেটর হিসাবে কাজ করেছে, তবে সি # এ এটি সামান্য বুদ্ধিমান অপারেটর।

ক্ষতিকারক ক্রিয়াকলাপ পরিচালনা করতে কি আমাকে একটি লুপ লিখতে হবে বা অন্য কোনও নেমস্পেস যুক্ত করতে হবে? যদি তা হয় তবে আমি কীভাবে অ-পূর্ণসংখ্যা ব্যবহার করে ক্ষতিকারক ক্রিয়াকলাপগুলি পরিচালনা করব?


7
এটি সি # তে নেই, তবে অনেকগুলি ভাষা **ইনফিক্স এক্সপেনসিয়েশন অপারেটর হিসাবে ব্যবহার করে ।
মার্ক রুশাকফ

এখানে এসেছিল কারণ আমাকে বিভ্রান্ত করা হয়েছিল যে দীর্ঘ Int / Int64 সঞ্চিত 10 ^ 7 আমাকে "13" দিচ্ছে " আমি 1E7 চেষ্টা করেও দেখেছি, তবে এটি আমাকে একটি ত্রুটি দিয়েছে। যেহেতু আমি কোনও ধরণের ত্রুটি / অবৈধ অপারেটর সিনট্যাক্স ত্রুটিটি দেখছি না, আমি ধরে নিয়েছিলাম যে আমার 10 ^ 7 কাজ করছে ...
এমপিএজি

1
@mpag the একচেটিয়া বা অপারেটর, সুতরাং 10 ^ 7 = 1010b XOR 0111b = 1101b = 13.
ইয়ান ব্রকব্যাঙ্ক

উত্তর:


227

সি # ভাষার কোনও পাওয়ার অপারেটর নেই । যাইহোক, .NET ফ্রেমওয়ার্ক ম্যাথ.পাউ পদ্ধতিটি সরবরাহ করে:

নির্দিষ্ট পাওয়ারে উত্থিত একটি নির্দিষ্ট নম্বর প্রদান করে।

সুতরাং আপনার উদাহরণটি এর মতো দেখাবে:

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Math.Pow(Number1, Number2);

1
যদি বর্গ জন্য Math.Pow ব্যবহার মনে কর্মক্ষমতা শাস্তি রাখুন stackoverflow.com/questions/936541/...
Justas

4
@ জাস্টাস আমি কেবল এটি নেট কোর ২.১ এবং ম্যাথ পরীক্ষা করেছি।
বাইটেডেভ

50

আমি আমার পোস্টে বৈজ্ঞানিক স্বরলিপি ব্যবহার করার জন্য এই পোস্টটিতে হোঁচট খেয়েছি, আমি ব্যবহার করেছি

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

তবে পরে আমি জানতে পেরেছিলাম আপনি করতে পারেন

4.95E-10;

আমি ভেবেছিলাম যে আমি যে পরিস্থিতিতে ছিলাম তেমনই কারও জন্য এটি যুক্ত করব।


34

এমএসডিএন-তে একটি ব্লগ পোস্ট রয়েছে যে কেন সি # টিম থেকে কোনও অভিজাত অপারেটর উপস্থিত নেই

ভাষায় একটি পাওয়ার অপারেটর যুক্ত করা সম্ভব হবে, তবে বেশিরভাগ প্রোগ্রামে এই অপারেশনটি করা মোটামুটি বিরল কাজ, এবং ম্যাথ.পাউ () কে কল করার সময় কোনও অপারেটর যুক্ত করা ন্যায়সঙ্গত বলে মনে হয় না ।


তুমি জিজ্ঞেস করেছিলে:

ক্ষতিকারক ক্রিয়াকলাপ পরিচালনা করতে কি আমাকে একটি লুপ লিখতে হবে বা অন্য কোনও নেমস্পেস যুক্ত করতে হবে? যদি তা হয় তবে আমি কীভাবে অ-পূর্ণসংখ্যা ব্যবহার করে ক্ষতিকারক ক্রিয়াকলাপগুলি পরিচালনা করব?

ম্যাথ.পো ডাবল প্যারামিটার সমর্থন করে তাই আপনার নিজের লেখার দরকার নেই।


24
আমি যুক্তিটি বুঝতে পারি, তবে একটি বৈধ কারণ হ'ল ম্যাথ.প্যাও () কনস্টের মান নির্ধারণ করতে ব্যবহার করা যাবে না, যা এক্সটোন্টরকে সমস্ত ধ্রুবকের জন্য অকেজো করে তোলে।
jsmars

1
একটি পাওয়ার অপারেটর অপারেটর ওভারলোডিংয়ের জন্য সুবিধাজনক হবে, আমার কাছে ম্যাথ। পাও () ম্যাথ হিসাবে কোনও এক্সপোঞ্জার অপারেটর তৈরি না করার সত্যতা প্রমাণ করে না ow পাও () কোনও অপারেটর নয় এটি কোনও অপারেটরের মতো একই ব্যবহার হয় না _ ।
আলেকজান্দ্রে ডাব্রিকোর্ট

8

আমাদের ক্যালকুলেশন সফ্টওয়্যারটিকে ভাল ওল 'ভিবি 6 থেকে রূপান্তর করতে কোনও নতুন ভাষার সন্ধান করার সময় সি # এর জন্য তাত্পর্যপূর্ণ অপারেটরের অভাব আমাদের জন্য একটি বড় বিরক্তি ছিল।

আমি আনন্দিত যে আমরা সি # তে গিয়েছিলাম কিন্তু এটি এখনও আমাকে বিরক্ত করে যখনই আমি এক্সপোজারগুলি সহ একটি জটিল সমীকরণ লিখি। ম্যাথ.পো (পদ্ধতি) আইএমও পড়তে সমীকরণগুলি বেশ শক্ত করে তোলে।

আমাদের সমাধানটি হ'ল একটি বিশেষ ডাবলএক্স ক্লাস তৈরি করা যেখানে আমরা ope-অপারেটরটিকে ওভাররাইড করি (নীচে দেখুন)

আপনি যতক্ষণ না কমপক্ষে একটি ভেরিয়েবলগুলিকে ডাবলএক্স হিসাবে ঘোষণা করেন ততক্ষণ এটি মোটামুটি কার্যকর হয়:

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;

3
এটির গুণ নয়, এর শক্তি।
হেনরি

হ্যাঁ @ হেনরি এবং অন্যরা যেমন উল্লেখ করেছে, অপারেটরটির অস্তিত্ব নেই। শুধু 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

কেউ দয়া করে ডাউনটোটটি ব্যাখ্যা করতে পারেন? আমি এই কোডটি পরীক্ষা করে দেখেছি এবং আপনি আদর্শেও / ও 9 মিমিও (সি #) এবং আইডিয়োন / ভিএনএকেজ ( ভিবি.এনইটি ) - এ এটি পুরোপুরি ভালভাবে কাজ করে বলে মনে হচ্ছে।
নাথানগ্রাদ

8
তাই আপনার কোড অপ্রাসঙ্গিকতার না থাকায় Math.Pow হয়
Thaina

1
ম্যাথ.প্যাও () ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে এবং পাওয়ারআফ যথাযথভাবে ছোট হওয়ায় এটি যথেষ্ট দ্রুত হবে।
ল্যামন্ট

3
@ নাথানগ্রাদ (বর্গক্ষেত্র) চাকা পুনরায় উদ্ভাবন করা বেশিরভাগ ক্ষেত্রে একটি বিরোধী-নিদর্শন হিসাবে বিবেচিত হয়। এফওয়াইআই: exceptionnotfound.net/…
বাইটেডে

এছাড়াও, আপনার নিজস্ব শক্তি পদ্ধতি বাস্তবায়নের দ্রুত উপায় thre দেখুন: en.wikedia.org/wiki/Exonentiation_by_squering
জেসি চিশলম

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 এর শক্তি বাড়ানোর সময় আমি worth অপারেটরটিকে মিস করি এটির পক্ষে মূল্য worth সেখানে ম্যাথ.পো () ব্যবহার করতে পারবেন না, তবে 1 এর একটি স্বাক্ষরযুক্ত বিন্যাসকে বাম দিকে ঘুরিয়ে ঘোরের মানের কাজ করে। যখন আমার (2 def 24) -1 এর একটি ধ্রুবক সংজ্ঞা দেওয়া দরকার:

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

মনে রাখবেন প্রকারগুলি অবশ্যই (uint) << (ইনট) হতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.