2011-12-27 11 views
5

पर इटरेट करें उस मामले पर विचार करें जहां आप हर संभव इनपुट मूल्य का परीक्षण करना चाहते हैं। एक ऐसा केस बनाना जहां आप सभी संभावित स्याही पर पुनरावृत्ति कर सकते हैं, काफी आसान है, क्योंकि आप केवल 1 से मूल्य बढ़ा सकते हैं और दोहरा सकते हैं।हर संभव डबल वैल्यू

आप सभी संभावित डबल मानों के लिए यह वही विचार करने के बारे में कैसे जाएंगे?

+1

खैर के बाद से आप पहले से ही हर संभव पूर्णांक पुनरावृति सकते हैं, बस एक सेट है कि हर संभव पूर्णांक/हर संभव पूर्णांक के होते हैं पुनरावृति। – asawyer

+2

बेशक आप महसूस करते हैं कि वास्तव में उन सभी को आजमाने के लिए बहुत से अलग युगल (या पूर्णांक के मामले में लंबे समय तक) हैं। –

+3

आपको ऐसी अवधारणा को लागू करने की आवश्यकता कहां है? – Lion

उत्तर

11

आप सभी संभावित long मानों को फिर से सक्रिय कर सकते हैं और फिर प्रत्येक संभावित 64-बिट संयोजन के लिए double प्राप्त करने के लिए Double.longBitsToDouble() का उपयोग कर सकते हैं।

नोट हालांकि यह कुछ समय लगेगा। यदि आपको प्रत्येक double मान के लिए प्रसंस्करण के 100 नैनोसेकंड की आवश्यकता होती है तो यह मोटे तौर पर ले जाएगा (सभी बिट संयोजन अलग-अलग डबल नंबर नहीं हैं, जैसे NaN) 2^64 * 1e-7/86400/365 साल जो 16e11/86400/365 से अधिक है = एक ही सीपीयू पर 50700 साल। जब तक आपके पास गणना करने के लिए डेटासेंटर नहीं है, तब तक एक इनपुट कॉन्फ़िगर करने योग्य बिंदुओं पर अंतराल को नमूना देने वाले सभी इनपुट मानों की संभावित सीमा पर जाने का बेहतर विचार है।

float के लिए एनालॉगस फीट अभी भी मुश्किल है लेकिन करने योग्य है: मान लीजिए कि आपको प्रत्येक इनपुट मान के लिए प्रसंस्करण के 10 मिलीसेकंड की आवश्यकता है, आपको एक ही CPU पर लगभग 2^32 * 1e-2/86400 = 497.1 दिन की आवश्यकता है। आप इस मामले में Float.intBitsToFloat() का उपयोग करेंगे।

+0

+1 लेकिन ध्यान दें कि 'Double.longBitsToDouble()' भी अनंतता और (बहुत सी) NaN बनाएगा - शायद –

0

जावा की Double कक्षा आपको अपने घटकों के टुकड़ों में डबल मानों को बनाने और अलग करने देती है। यह, और डबल प्रतिनिधित्व की समझ, आपको कम से कम अवधारणा को सभी संभावित युगलों की गणना करने की अनुमति देगा। आपको शायद पता चलेगा कि बहुत सारे हैं।

0

की तरह एक पाश कार्य करें:

for (double v = Double.MIN_VALUE; v <= Double.MAX_VALUE; v = Math.nextUp(v)) { 
    // ... 
} 

लेकिन जैसा कि पहले से ही एडम जवाब में बताया गया है, इसे चलाने के लिए समय लगेगा।
(यह न NaN है और न ही इन्फिनिटी पैदा करेगा)

+0

'Double.MIN_VALUE' का परीक्षण करने के लिए वांछित है वास्तव में सबसे छोटा डबल ** ** से अधिक ** ** है, इसलिए यह केवल संभावित मूल्यों का आधा हिस्सा देगा। –

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