मुझे स्विफ्ट भाषा के संदर्भ में आधार अंकगणितीय ऑपरेटरों में परिभाषित प्रतिपादक ऑपरेटर नहीं दिखता है।
क्या वास्तव में भाषा में कोई पूर्वनिर्धारित पूर्णांक या फ्लोट प्रतिपादक ऑपरेटर नहीं है?
मुझे स्विफ्ट भाषा के संदर्भ में आधार अंकगणितीय ऑपरेटरों में परिभाषित प्रतिपादक ऑपरेटर नहीं दिखता है।
क्या वास्तव में भाषा में कोई पूर्वनिर्धारित पूर्णांक या फ्लोट प्रतिपादक ऑपरेटर नहीं है?
जवाबों:
कोई ऑपरेटर नहीं है, लेकिन आप इस तरह पॉव फ़ंक्शन का उपयोग कर सकते हैं:
return pow(num, power)
यदि आप चाहते हैं, तो आप एक ऑपरेटर को इस तरह से पॉव फ़ंक्शन कॉल कर सकते हैं:
infix operator ** { associativity left precedence 170 }
func ** (num: Double, power: Double) -> Double{
return pow(num, power)
}
2.0**2.0 //4.0
**
, इसलिए आप इसे स्याही पर उपयोग कर सकते हैं और XOR के साथ संघर्ष नहीं कर सकते।
-2.0**2.0 = -(2.0**2.0) = -4.0
। हालांकि, यहां -2.0**2.0 = (-2.0)**2.0 = 4.0
, जो कि इच्छित उपयोग नहीं हो सकता है और बग को ट्रैक करने के लिए काफी बुरा और कठिन हो सकता है।
<<
और 160 की पूर्वता के साथ >>
। अलग-अलग प्राथमिकताओं से अलग-अलग कोड व्याख्याएं होंगी, इसलिए आम ऑपरेटरों के लिए एक पूर्वता पर मानकीकरण महत्वपूर्ण है। मुझे नहीं पता कि सबसे अच्छा मानक क्या है, लेकिन देना << 2
और ** 2
उसी तरह की मिसाल कुछ मायने रखती है। nshipster.com/swift-operators
यदि आप किसी शक्ति के लिए 2 बढ़ा रहे हैं, तो आप बिटवाइड लेफ्ट शिफ्ट ऑपरेटर का उपयोग कर सकते हैं:
let x = 2 << 0 // 2
let y = 2 << 1 // 4
let z = 2 << 7 // 256
ध्यान दें कि 'शक्ति' का मूल्य आपके विचार से 1 कम है।
ध्यान दें कि यह तेजी से है pow(2.0, 8.0)
और इससे आप डबल्स का उपयोग करने से बच सकते हैं।
let x = 0b00000001 << exponent // 2**exponent let x = 1 << 0 // 1 let x = 1 << 2 // 4 let x = 1 << 8 // 256
**
इन्फिक्स ऑपरेटर के एक स्विफ्ट 3 संस्करण की तलाश में किसी के लिए :
precedencegroup ExponentiationPrecedence {
associativity: right
higherThan: MultiplicationPrecedence
}
infix operator ** : ExponentiationPrecedence
func ** (_ base: Double, _ exp: Double) -> Double {
return pow(base, exp)
}
func ** (_ base: Float, _ exp: Float) -> Float {
return pow(base, exp)
}
2.0 ** 3.0 ** 2.0 // 512
(2.0 ** 3.0) ** 2.0 // 64
import Darwin
पाने के लिए मत भूलनाpow
2**3**2
में ५१२ है, ६४ नहीं। मैं किसी भी प्रोग्रामिंग भाषा को बाएं-सहयोगी एक्सपोनेंट्री ऑपरेटर के साथ नहीं जानता। वे सभी सही सहयोगी हैं। यदि आप इसे स्विफ्ट में लागू करते हैं, तो आपको निश्चित रूप से अन्य लोकप्रिय भाषाओं के साथ-साथ गणितीय सम्मेलन के अनुरूप होने के लिए यह सही-सहयोगी होना चाहिए ।
यदि आप विशेष रूप से Int
प्रकार के लिए घातांक ऑपरेटर में रुचि रखते हैं , तो मुझे नहीं लगता कि मौजूदा उत्तर विशेष रूप से बड़ी संख्या के लिए अच्छी तरह से काम करेंगे जिस तरह से फ़्लोटिंग पॉइंट संख्याओं को स्मृति में दर्शाया जाता है। जब में कनवर्ट करने Float
या Double
से Int
वापस और फिर (के लिए आवश्यक है जो pow
, powf
और powl
कार्यों में Darwin
मॉड्यूल) आप परिशुद्धता खो सकते हैं । इसके लिए एक सटीक संस्करण यहां दिया गया है Int
:
let pow = { Array(repeating: $0, count: $1).reduce(1, *) }
ध्यान दें कि यह संस्करण विशेष रूप से मेमोरी कुशल नहीं है और स्रोत कोड आकार के लिए अनुकूलित है।
एक और संस्करण जो एक मध्यवर्ती सरणी नहीं बनाएगा:
func pow(_ x: Int, _ y: Int) -> Int {
var result = 1
for i in 0..<y {
result *= x
}
return result
}
अधिकांश सी-परिवार भाषाओं की तरह, एक नहीं है।
NSExpression का उपयोग करने के लिए एक वैकल्पिक उत्तर है
let mathExpression = NSExpression(format:"2.5**2.5")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Double
या
let mathExpression = NSExpression(format:"2**3")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Int