2011-12-16 14 views
5

से अंक निकालने double x को देखते हुए, और यह मानते हुए कि यह [0,1] में है। उदाहरण है कि एक्स = 0.3 द्विआधारी में, (दशमलव बिंदु के बाद 10 अंक रखते हुए), यह प्रतिनिधित्व किया है के लिए मान लें के रूप मेंएक फ्लोट सी ++

x=0.0100110011... 

मैं कुछ सी ++ कोड जो 10 अंक दशमलव बिंदु के बाद पता चला निकाल देंगे लिखना चाहते हैं । दूसरे शब्दों में मैं पूर्णांक (0100110011) _2 निकालना चाहता हूं।

अब मैं काफी बिट स्थानांतरण और (भोली) समाधान जो मैं इस समस्या के लिए है करने के लिए नया हूँ निम्नलिखित

int temp= (int) (x*(1<<10)) 

तब द्विआधारी आवश्यक 10 अंक होगा में temp है।

क्या यह उपरोक्त प्रक्रिया को करने का एक सुरक्षित तरीका है? या क्या ऐसा करने के लिए सुरक्षित/अधिक सही तरीके हैं?

नोट: मैं अंक एक चरित्र सरणी के रूप में निकाला नहीं करना चाहती। मैं इसके लिए विशेष रूप से एक पूर्णांक (या हस्ताक्षरित पूर्णांक) चाहता हूं। ऐसा करने का कारण यह है कि octrees की पीढ़ी में, अंतरिक्ष में बिंदुओं को हैश कुंजी को मोर्टन कीज़ नामक अपनी स्थिति के आधार पर दिया जाता है। इन चाबियों को आमतौर पर पूर्णांक के रूप में संग्रहीत किया जाता है। सभी बिंदुओं के लिए एकीकृत कुंजी प्राप्त करने के बाद उन्हें क्रमबद्ध किया जाता है। सैद्धांतिक रूप से इन चाबियों को निर्देशांक को [0,1] स्केल करके, बिट्स निकालने और उन्हें अंतःस्थापित करके प्राप्त किया जा सकता है।

+4

10 बाइनरी अंक, या दशमलव अंक? –

+0

* पूरे * मंटिसा को मुद्रित क्यों न करें, जितना ज़रूरी आवश्यक हो उतना ज़ीरो? –

+0

@ ओली चार्ल्सवर्थ: कृपया संपादन देखें। मैंने अपने प्रश्न को स्पष्ट किया है। – smilingbuddha

उत्तर

1

उपयोग memcpy 32-बिट नंबर की एक सरणी में डबल कॉपी करने के लिए, इस तरह:

unsigned int b[2]; // assume int is 32-bits 
memcpy(b, &x, 8); 

सबसे महत्वपूर्ण 10 बाइनरी अंकों पर कि क्या आपके मशीन big- या कम है निर्भर करता है, b[0] या b[1] में हैं -endian।

संपादित करें: यह memcpy के बजाय कुछ कास्टिंग द्वारा हासिल किया जा सकता है, लेकिन यह सख्त एलियासिंग नियमों का उल्लंघन करेगा। एक विकल्प union का उपयोग करना है।

+1

+1। –

+0

ओपी ने दशमलव बिंदु के बाद 10 अंकों के लिए पूछा, 10 सबसे महत्वपूर्ण अंक नहीं। तो घाटे को भी ध्यान में रखा जाना चाहिए। (लेकिन ओपी का प्रस्तावित समाधान कार्य के लिए पूरी तरह से पर्याप्त है, बिट्स को बिना किसी चीज के।) – TonyK

0

इस पढ़ें: http://chrishecker.com/images/f/fb/Gdmfp.pdf

आप grok कर सकते हैं क्या है कि लेख आपको बता रहा है, तो आप एल्गोरिथ्म आप देख रहे हैं प्राप्त कर सकते हैं। बस घाटे में पूर्वाग्रह कारक और मंथिसा में अंतर्निहित अग्रणी व्यक्ति को याद रखें और बाकी को जगह में गिरना चाहिए।

+0

एके, समझ समझने की विफलता। आपके बेवकूफ समाधान को भी काम करना चाहिए।ऊपर दिया गया लेख वैसे भी अच्छी जानकारी है। एकाधिक विकल्पों का उल्लेख करने के लिए – mcmcc

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