2010-02-12 11 views
10

मैं एक प्रोग्राम बनाए रख रहा हूं जो पीडीपी -11 (नकली!) प्रोग्राम से डेटा लेता है और इसे आधुनिक विंडोज-आधारित सिस्टम में रखता है। हमें "1. # क्यूएनएएन" और "1. # क्यूएनबी" के रूप में रिपोर्ट किए गए कुछ डेटा मानों में समस्याएं आ रही हैं। ग्राहक ने हाल ही में खुलासा किया है कि पीडीपी -11 कार्यक्रम में 'खराब' मानों को 2 16-बिट शब्दों द्वारा दर्शाया जाता है, जिनमें पहले बिट्स सेट किए गए सभी बिट्स सेट होते हैं। मुझे लगता है कि यह तब होता है जब हम इन्हें आईईईई फ्लोट में बदलने की कोशिश करते हैं कि हमें त्रुटियां मिल रही हैं।क्या यह सी ++ पीडीपी -11 फ्लोट आईईईई में परिवर्तित करेगा?

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

// ---------------------------------------------------------------- cnvPDPfloat 
// CNVPDPFLOAT 
// ---------------------------------------------------------------------------- 
// 
// Converts PDP11 float (two 16-bit words) into IEEE float 
// 
// PDP11 and IEEE floats have same layout so can be mapped onto eachother. 
// But PDP11 exponent must have 2 subtracted for IEEE. Or just divide by 4. 
// 
float cnvPDPfloat(PDP11Float input) 
{ 
union 
{ 
    unsigned long pdp11; 
    float ieee; 
} uFloat; 

uFloat.pdp11 = (input.word[0] << 16) + input.word[1]; 

return (uFloat.ieee/(float) 4.0); 
} 

--- एलिस्टेयर।

+3

+1 बस है। –

+0

ध्यान दें कि '1. # क्यूएनबी' बस 4 स्थानों पर' 1. # QNAN' "गोलाकार" है। (मुझे '# आईएनएफ' के "सामान्य" होने के अधिक सामान्य मामले के बारे में पिछले SO प्रश्न नहीं मिल रहा है। '0 जे'' –

उत्तर

0

पीडीपी -11 ने फ्लोटिंग पॉइंट नंबरों के लिए मिश्रित-एंडियन प्रतिनिधित्व का उपयोग किया। इसलिए कोड

uFloat.pdp11 = (input.word[0] << 16) + input.word[1]; 

के इस हिस्से सही यदि आपका डेटा पहले से ही शब्द-बदली इससे पहले कि आप इसे पाने के नहीं किया गया है है।

इस दस्तावेज़ को अलग फ्लोटिंग बिंदु प्रारूपों http://www.quadibloc.com/comp/cp0201.htm

का एक बहुत यह कहना है कि टी PDP-11/VAX प्रतिपादक के लिए अतिरिक्त 128 अंकन इस्तेमाल किया के लिए प्रतिनिधित्व का विवरण देता है। जबकि आईईईई 754 अतिरिक्त 126 नोटेशन का उपयोग करता है, इसलिए यदि यह सही है, तो 4 से विभाजित एक्सपोनेंट को समायोजित करने का सही तरीका प्रतीत होता है।

हालांकि, विकिपीडिया का कहना है कि आईईईई 754 के लिए एक्सपोनेंट पूर्वाग्रह 127 है, 126 नहीं। तो या तो उपरोक्त दस्तावेज़ एक अजीब नोटेशन का उपयोग कर रहा है, या यह गलत है। यह संभव है कि आपको 4 से 4 से विभाजित करने की आवश्यकता है।

1

this page से, पीडीपी -11 प्रारूप आईईईई -754 फ्लोटिंग-पॉइंट प्रारूप के समान है, सिवाय इसके कि एक्सपोनेंट पीडीपी -11 में 128 से पक्षपातपूर्ण है, जबकि यह आईईईई -754 में 127 द्वारा पक्षपातपूर्ण है। तो, आपको 2.0 से विभाजित करने की जरूरत है और 4.0 नहीं। यह NaNs और infinities का ख्याल नहीं रखता है, लेकिन मेरी Google खोजों से, ऐसा लगता है कि पीडीपी -11 में ऐसा नहीं था।

आपको ओवरफ़्लो के साथ भी समस्याएं होंगी। पीडीपी प्रारूप पहले बहता है, लेकिन मुझे लगता है कि यह ठीक है क्योंकि एक बार पहले से ही एक संख्या पहले से बहने के बाद आप कुछ भी नहीं कर सकते हैं।

+0

गलत। इसे 4 से विभाजित किया जाना चाहिए। नीचे मेरा जवाब देखें। – marcin

0

नाएन और इंफ के अलावा, आपको असामान्य मूल्यों के रूपांतरण के साथ भी समस्या हो सकती है। मुझे नहीं पता कि पीडीपी -11 इन का समर्थन करता है, लेकिन आईईईई 754 कहता है कि जब एक्सपोनेंट फील्ड 0 होता है, तो संख्याएं denormals हैं, प्रभावी रूप से अर्थ है कि मंथिसा क्षेत्र में अंतर्निहित अग्रणी 1 0. हो जाता है। इस तरह एक संख्या घटने पर 0 से क्रमिक अभिसरण।

@ जॉन - आईईईई 754 मानक बताता है कि एक्सपोनेंट पूर्वाग्रह 127 है, 126 नहीं। विकी सही है और दूसरा संदर्भ गलत है। तो, अनुपात 2.0 होगा।

2

कोड अपरिभाषित मूल्य की जांच नहीं करता, साफ-शून्य और गंदा शून्य, लेकिन 4 से विभाजित, अन्य उत्तर में चर्चा की, अच्छा है। ओपी शायद इसे जानता है क्योंकि अगर परिणाम हमेशा गलत होता तो वे स्पॉट करेंगे। प्रतिपादक पूर्वाग्रह भी आज मुझे उलझन में है, इसलिए मैं उद्धृत करता हूँ कि मैं क्या सिर्फ इस ठीक दस्तावेज़ में पढ़ा है: पहली छिपा बिट पर

एक और स्थिति दिया जाता है: Binary floats with hidden bit। आईईईई अंशकालिक अवधि से पहले मानता है और डिजिटल उस अवधि को के तुरंत बाद मानता है। आईईईई के मुताबिक मंथिसा ('विस्मान') का दृश्य हिस्सा अवधि के तुरंत बाद शुरू होता है, जबकि डिजिटल के अनुसार यह छिपे हुए बिट के पीछे शुरू होता है। इस प्रकार कुल अपूर्णांश का मूल्य सीमा है:

IEEE:  1.0 =< (1.visman) < 2.0 
Digital: 0.5 =< (0.1 visman) < 1.0 

दूसरे पर प्रतिपादक के अंकन में अतिरिक्त-पूर्वाग्रहों भिन्न होते हैं। [1 तक)

दोनों प्रभाव एक साथ आईईईई-फ्लोट में थोड़ा पैटर्न मानते हैं कि मूल्य के आकार में चार बार पैटर्न डिजिटल-फ्लोट स्टैंड में दर्शाता है।

यह भी बताता है कि क्यों कुछ संदर्भों राज्य है कि आईईईई पूर्वाग्रह सच है कि आप PDP-11 कोड बनाए रखने के लिए होती हैं, के 126

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