2011-05-09 14 views
18

मेरे पास कुछ (विरासत एम्बेडेड सी) कोड है जो कुछ sprintf कॉल के माध्यम से एक .csv फ़ाइल उत्पन्न करता है। कभी-कभी मैं 1.#QO के मान देखता हूं। मैंने उन मूल्यों को उन परिस्थितियों के साथ पुन: पेश करने का प्रयास किया है जो नकारात्मक अनंतता, सकारात्मक अनंतता और NaN देना चाहिए लेकिन उनमें से कोई भी मुझे जादुई 1.#QO परिणाम देने के लिए प्रतीत होता है। तो यह क्या है जो उस मूल्य का उत्पादन करता है?क्या फ्लोट वैल्यू sprintf_s() उत्पन्न करता है "1. # क्यूओ"?

... और हाँ, मुझे पता है कि गणित में कुछ गलत हो रहा है जो उस मूल्य का उत्पादन करता है, लेकिन समझने का अर्थ यह है कि डीबगिंग प्रयास में सहायता मिलेगी।

[संपादित करें 1] वास्तविक रेखा है जो रूपांतरण करता है:

sprintf_s(txt, CSV_HEADER_SIZE, "%.3f", value); 

जहां:

#define CSV_HEADER_SIZE (100) 
char txt[CSV_HEADER_SIZE]; 

मैं एमएस दृश्य स्टूडियो के साथ संकलन कर रहा हूँ 2008.

[संपादित करें 2] थोड़ा और खुदाई दिखाता है 0xFFFFFFFF-1.#QO देता है:

unsigned int i = 0xFFFFFFFF; 
float* f = (float*)&i; 
printf("%.3f", *f); // gives -1.#QO 

..और विजुअल स्टूडियो डीबगर में है कि को देख -1.#QNAN00 को वह फैलता तो ऐसा लगता है कि यह शायद NaN की एक माइक्रोसॉफ्ट विशेष प्रतिनिधित्व है?

+3

प्रश्न में 'sprintf() 'पंक्ति क्या है? – CanSpice

+0

क्या आप इस परिणाम को उत्पन्न करने वाले मानों में से एक की पहचान कर सकते हैं और अंतर्निहित फ्लोट डेटा को प्रारूप में कह सकते हैं, हेक्स? उदाहरण के लिए, यदि यह 4-बाइट फ्लोट है तो आप 'printf ("% X", मान) ', या 8-बाइट के लिए' printf ("% llX ", मान) करने में सक्षम हो सकते हैं ' मंच। यह जानकारी उपयोगी होगी। –

+0

क्या आप संकलक (और, यदि लागू हो, रनटाइम) की पहचान कर सकते हैं?उस विशेष 'स्प्रिंटफ' आउटपुट मानक में पिछले मानक में नहीं था, इसलिए यह शायद बहुत कार्यान्वयन-निर्भर है। –

उत्तर

11

"-1। # क्यूओ" दशमलव के बाद 3 स्थानों के लिए "राउंडिंग" के बाद "-1। # क्यूएनएएन" है। एन ओ को 'ए'> = '5' और 'एन' + 1 == 'ओ' के रूप में ओ राउंड करता है।

इसी तरह आपका डीबगर "-1। # क्यूएनएएन 00" दिखाता है, क्योंकि यह 7 स्थानों के साथ प्रिंट करता है और अंत में पैडिंग शून्य जोड़ता है।

क्यूएनएएन quiet NaN है।

+0

यह निष्कर्ष था कि मैं भी पहुंचा। अजीब बात यह है कि हालांकि अंत में 'ओ' जोड़ा गया। –

+0

@ जोनकेज: एमएसवीसी क्यूएनएएन को अलग-अलग "नियमित"/गैर-NaN मानों से अलग करने के बजाय, आवश्यक स्थानों को भरने के लिए पिछला शून्य का उपयोग करता है। दशमलव के बाद डिफ़ॉल्ट स्थान 6 है, इसलिए NaN के साथ "% f" को गठबंधन करें (जैसा कि आपके उत्तर में है) और याद रखें strlen ("# QNAN") 5 है ... :) –

+1

वह अंतिम वर्ण एक अक्षर है ('O') हालांकि शून्य ('0') के बजाए। मुझे लगता है कि यह 'ओ' तक 'ओ' तक गोल कर रहा है क्योंकि यदि आप'% .2f' का उपयोग करते हैं तो आपको '-1। # आर' :-) –

1

0 त्रुटि से विभाजित करने के लिए थोड़ा गुगल अंक। हालांकि अगर ऐसा होता तो मैं कुछ अलग उम्मीद करता। ऐसा कहा जाता है, यह एमएस/विजुअल सी

+1

क्या मैं पूछ सकता हूं कि यह क्या था आप उस दिशा में? –

+1

इस ब्लॉग पोस्ट के नीचे: http://journal.joshburton.com/2008/01/1qo-value-of-doom.html – BMitch

1

के लिए विशिष्ट प्रतीत होता है क्या आपने जांच की है कि sprintf_s() विफलता लौटाई गई है या नहीं? यदि ऐसा होता है, तो आपको परिणाम का उपयोग नहीं करना चाहिए। चूंकि कोड आपके जैसा चेक नहीं दिखता है, मुझे लगता है कि आपको यह जांच करना चाहिए। वास्तव में, यदि आप *_s() कार्यों में से किसी एक के परिणाम का परीक्षण नहीं करते हैं, तो आप परेशानी के लिए नेतृत्व कर रहे हैं।

+0

प्रलेखन से मैंने देखा है [http://msdn.microsoft.com/en -us/लाइब्रेरी/ce3zzk1k% 28v = vs.80% 29.aspx] यह केवल तभी है जब यह '<= 0' लौट रहा है कि कोई समस्या है (कोई त्रुटि या कोई वर्ण नहीं लिखा गया है)? लेकिन चूंकि मूल्य ठीक से लिखा जा रहा है, मुझे संदेह है कि समस्या है जहां समस्या है। वास्तविक कोड जिसका हम उपयोग कर रहे हैं वह थोड़ा और अधिक शामिल है। मैंने इसे और अधिक संक्षेप में बनाने के लिए इसे नीचे गिरा दिया (शायद बहुत अधिक?)। हम अभ्यास में वापसी मूल्यों की जांच करते हैं। –

+0

यदि आप परिणाम का परीक्षण करते हैं, तो आप शायद ठीक हैं। यह आपके 'स्निपेट' से स्पष्ट नहीं था कि आपने वापसी मूल्य की जांच की है। मुझे आपके लिंक से '404 नहीं मिला' मिला; लेकिन [यह] (http://msdn.microsoft.com/en-us/library/ce3zzk1k.aspx) काम किया। –

+0

उचित बिंदु और मूल्यवान जांच है कि मैं उस बिंदु को याद नहीं करता :-) –

2

के बाद लगभग नगण्य का एक बहुत मैं अंतिम तौर कह सकते हैं कि 0x7FFFFFFF करने के लिए एक 4 बाइट नाव की स्थापना और %.3f के एक फॉर्मेट स्पेसिफायर साथ sprintf_s में इसे पारित क्या मुझे 1.#QO दिया है:

const int bufSize = 100; 
char buf[bufSize]; 
unsigned int i; 
float* f = (float*)&i; 
int retval; 

i = 0xFFFFFFFF; 
retval = sprintf_s(buf, bufSize, "%.3f\n", *f); 
printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 7, converted val = -1.#QO 
retval = sprintf_s(buf, bufSize, "%f\n", *f); 
printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 10, converted val = -1.#QNAN0 

i = 0x7FFFFFFF; 
retval = sprintf_s(buf, bufSize, "%.3f\n", *f); 
printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 6, converted val = 1.#QO 
retval = sprintf_s(buf, bufSize, "%f\n", *f); 
printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 9, converted val = 1.#QNAN0 

... ऐसा लगता है कि %.3f प्रारूप विनिर्देशक एनएएन परिणाम को फसल कर रहा था, इसलिए 1.#QNAN0 को 1.#QO पर काटा जा रहा था।

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