2010-07-15 3 views
16

मैं जानता हूँ कि यह वास्तव में बाहर बारी सरल होने के लिए होगा वापस जाने के लिए, लेकिन मेरे दिमाग में सिर्फ काम नहीं कर रहा। मुझे सी # में एक फ़ंक्शन की आवश्यकता है जो कि वापस लौटाएगा यदि फ़ंक्शन पर पास किए गए पूर्णांक का ऋणात्मक चिह्न होता है, तो 1 लौटाएं यदि पूर्णांक के पास सकारात्मक संकेत है और यदि 0 पारित संख्या 0 है तो 0 लौटाएं। इसलिए उदाहरण के लिए:एक समारोह निशानी

int Sign=SignFunction(-82); // Should return -1 
int Sign2=SignFunction(197); // Should return 1 
int Sign3=SignFunction(0); // Should return 0 

उत्तर

39

यह पहले से ही ढांचे में है। बस Math.Sign का उपयोग करें ...

int sign = Math.Sign(-82); // Should return -1 
int sign2 = Math.Sign(197); // Should return 1 
int sign3 = Math.Sign(0); // Should return 0 

इसके अलावा, यह के साथ काम करेंगे:

int sign4 = Math.Sign(-5.2); // Double value, returns -1 
int sign5 = Math.Sign(0.0m); // Decimal, returns 0 
// .... 
+2

+1 सूखी/DRTW .... –

+0

एक पूरी तरह से अच्छा मौजूदा पहिया – seanb

+0

haha ​​उन कार्यों मैं उपयोग करने के लिए की जरूरत कभी नहीं में से एक है, तो कभी नहीं पता था कि यह अस्तित्व में। धन्यवाद! – Icemanind

3
public int SignFunction(int number) 
{ 
    return number.CompareTo(0); 
} 
+0

एंथोनी Pegram के जवाब देने के लिए मेरी टिप्पणी देखें। यह एक कार्यान्वयन विस्तार है कि Int32 की तुलना करने के लिए फ़ंक्शन -1, 1 या 0 लौटाता है - निर्दिष्ट व्यवहार नहीं। यह ढांचे के बीच बदल सकता है। Math.Sign का प्रयोग करें। –

3
public int SignFunction(int input) 
{ 
    if(input < 0) return -1; 
    if(input > 0) return 1; 
    return 0; 
} 
+0

+1 एपीआई – Falmarri

+2

@Falmarri का उपयोग नहीं करने के लिए LOL मुझे लगता है कि एक बहस कर सकते इस सी # का एक और कार्यान्वयन कि .नेट फ्रेमवर्क शामिल नहीं हो सकता है के लिए पोर्टेबल है। – AaronLS

+0

वास्तव में यह फ़ंक्शन एक मानक एफपीयू ऑपरेशन है, इसलिए मुझे नहीं लगता कि किसी को इसके बिना कार्यान्वयन किया जा सकता है ;-) यह भी दर्शाता है कि यह कार्यान्वयन API से धीमा है। – mbq

0
public int Sign(int number) 
{ 
    if(number==0) 
     return 0; 
    return number/Math.Abs(number); 
} 
+0

ओहों ने गलती से आपके समाधान को संपादित किया! –

+0

यह ठीक है मैंने बड़ी गलती की है;) – Gregoire

+0

ऊपर जोश के समान समस्या - int.MinValue विफल रहता है। –

2
public int SignFunction(int number) { 
    return (number > 0) ? 
      1 : (number < 0) ? 
        -1 : number; 
} 
+0

डाउनवोट क्यों, मुझे आश्चर्य है। –

+0

मैंने आपको कम नहीं किया, लेकिन मुझे लगता है कि यह किसी भी लाभ के साथ "चालाक" तरीका कुछ करने का एक आदर्श उदाहरण है। यही कारण है कि है: [लुकास Heneks] (http://stackoverflow.com/questions/3259509/a-function-to-return-a-sign/3259528#3259528) द्वारा प्रदान की जवाब देने के लिए इस की तुलना करें। दुनिया में एक प्रोग्रामर नहीं अपने संस्करण को समझ नहीं पाएगा। आपके कुछ भ्रम पैदा हो सकते हैं (यह नहीं होना चाहिए, लेकिन यह हो सकता है)। वे वही करते हैं। तर्क देखें? –

+0

@ डैन मैं आपके साथ * सैद्धांतिक रूप से * चीजों को बहुत चालाकी से करने के बारे में सहमत हूं। लेकिन मैं टर्नरी अभिव्यक्तियों के बारे में अलग होना चाहता हूं। मुझे नहीं लगता कि वे समझने में बहुत मुश्किल हैं, IMHO :)। लेकिन हाँ, मैं देख सकता हूं कि सीधा समाधान के रूप में समझना इतना आसान नहीं है। –

3
return input.CompareTo(0); 
+0

+1 तुलना करें क्योंकि तुलनात्मक रूप से Math.Sign के समान ही लागू किया गया है। Math.Sign ने शून्य को हार्डकोड किया है;) –

+0

@Mikael: तुलना करें, हालांकि, एक बहुत ही अलग उपयोग का सुझाव देता है। गणित। आपके मूल उद्देश्य के बारे में प्रोग्रामर को बताए जाने के बारे में बताएं। –

+0

कड़ाई से, IComparable.CompareTo केवल आवश्यकता है कि मूल्य इसे देता है, नकारात्मक शून्य या सकारात्मक तुलना के परिणाम से संकेत मिलता है हो - यह जनादेश नहीं है कि परिणाम -1, 0 या 1. int16 के शॉर्ट्स रिटर्न के लिए compareTo के कार्यान्वयन होना (int) x - (int) y x.CompareTo (y) के लिए। वास्तव में, compareTo का परिणाम को संभालने के लिए, आप इसे एक विवश मूल्य प्राप्त करने के Math.Sign को पारित करने के लिए चाहते हो सकता है। –

7
int sign = Math.Sign(number); 

यह पहले से ही मौजूद है।

1

तो Math.Sign मौजूद नहीं था, मैं इस करना होगा:

return x == 0 ? 0 : x/Math.Abs(x); 
+0

मुझे लगता है कि साइन (int.MinValue) हालांकि -1 लौटना चाहिए, बल्कि एक OverflowException फेंकने की तुलना में,। तो शायद आपको ऐसा नहीं करना चाहिए। (स्पष्ट होने के लिए: Math.Abs ​​(int.MinValue) -int.MinValue होगा, जो int.MaxValue + 1 है ... oops) –

+0

अक्षम और पढ़ने के लिए कठिन ... – AtliB

+0

धन्यवाद जेम्स, मैं पता नहीं था कि कैसे एबी लागू किया गया था। AtliB तुम क्या धूम्रपान कर रहे हैं? – Josh

संबंधित मुद्दे