2013-08-20 5 views
7

तो, कल कोडिंग अभ्यास के हिस्से के रूप में कुछ एफ # कोड के माध्यम से काम करते समय, एक और डेवलपर ने कुछ दिलचस्प बताया। हम एक सूची को संक्षेप में दिखाने के लिए कोड का एक त्वरित टुकड़ा कर रहे थे। अगर मैं कार्य करें:अंकगणित ओवरफ़्लो को फेंकने के लिए सूची कैसे कम करें

[1..100000] |> Seq.sum 

मैं निम्नलिखित त्रुटि मिलती है:

System.OverflowException: Arithmetic operation resulted in an overflow. 
    at <StartupCode$FSI_0003>[email protected]() 
Stopped due to error 

हालांकि, अगर मैं ऐसा:

[1..100000] |> List.reduce (+) 

मैं:

val it : int = 705082704 

मैं हालांकि एहसास कोड के इन दो टुकड़ों को एक ही पी पूरा करना चाहिए मान लीजिए वे बहुत अलग हैं। मैं सिर्फ उत्सुक हूं कि सूची प्राप्त करने का कोई तरीका है। मुझे एक बुरा जवाब देने के बजाय ओवरफ्लो एक्सेप्शन फेंकने के लिए?

+1

बस मौजूदा उत्तरों के लिए एक अतिरिक्त: '1..100000 = (100001 * 100000)/2 = 50000 की राशि 50000 = 0x12A06B550' जो एक अतिप्रवाह है। एक अतिप्रवाह बिट छोड़ना: '0x12A06B550 - 0x100000000 = 0x2A06B550 = 705082704'। – bytebuster

उत्तर

7

आप एक जाँच ऑपरेटर का उपयोग कर सकते हैं:।

[1..100000] |> List.reduce (Checked.(+)) 
7

च # स्रोत कोड

[<CompiledName("Sum")>] 
let inline sum (source: seq< (^a) >) : ^a = 
    use e = source.GetEnumerator() 
    let mutable acc = LanguagePrimitives.GenericZero< (^a) > 
    while e.MoveNext() do 
     acc <- Checked.(+) acc e.Current 
    acc 

सूचना की जांच की गई (ऑपरेटर) अंकगणित के लिए इस चेक के overflows से ...

http://msdn.microsoft.com/en-us/library/vstudio/ee340296.aspx

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