2011-04-01 3 views
19

में डबल के रूप में संग्रहीत नकारात्मक 0 का पता लगाना मैं कुछ गणितीय गणना कर रहा हूं (VS2010 का उपयोग करके मैटलैब कोड को C++ में परिवर्तित करने का प्रयास कर रहा हूं) और मुझे यह बताने में सक्षम होना चाहिए कि किसी बिंदु पर मुझे नकारात्मक 0 मिलता है।सी ++

आईईईई मानक -0/+ 0 के अनुसार केवल साइन बिट में शेष (बाकी 0 हैं)।

मैं कोड (post) का निम्न भाग का इस्तेमाल किया है एक अहस्ताक्षरित चार

double f = -5; 
    unsigned char *c = reinterpret_cast<unsigned char *>(&f); 
    for(int i=(sizeof(double)-1); i>=0; i--){ 
     printf("%02X", c[i]); 
    } 

5/-5 के साथ यह कोशिश कर रहा है के रूप में अपने डबल व्याख्या करने के लिए मैं उम्मीद परिणाम प्राप्त:

C014000000000000 (-5) 
4014000000000000 (5) 

लेकिन जब मैं 0/-0 के साथ कोशिश करता हूं तो मुझे दोनों मामलों में केवल शून्य मिलते हैं। वीएस -2010 का कहना है कि वे आईईईई अनुपालन (msdn) हैं, इसलिए मुझे यकीन नहीं है कि इसका कौन सा हिस्सा मुझे नहीं मिल रहा है।

यदि 0/-0 वास्तव में स्मृति में उसी तरह संग्रहीत किया जाता है, तो मुझे ऐसा करने का कोई तरीका नहीं है यदि मुझे ऐसा करने की ज़रूरत है तो मुझे अपना समय बर्बाद करना बंद कर देना चाहिए :) ठीक है?

+19

-0 – wimh

उत्तर

24

आप लिखते हैं तो

double d = -0; 

बाद निम्न होगा:

पहले, -0 मूल्यांकन किया जाएगा, प्रकार int की है जो, क्योंकि 0 प्रकार int की है। परिणाम 0. फिर 0 दोगुना करने के लिए कनवर्ट कर दिया जाएगा और इस तरह 0.0 जा रहा है सौंपा है, और नहीं -0,0

double d = -0.0; // is your solution. 
+3

के बजाय try -0.0 या आप यह भी कर सकते हैं: डबल डी = -0 डी; यह संकलक को सीधे इसे डबल के रूप में पढ़ने के लिए कहता है :) –

+5

@Eamonn: मुझे विश्वास नहीं है कि यह मानक है। और -0.0 वैसे भी "डबल के रूप में सीधे पढ़ा जाता है"। –

+0

मुझे पता था कि मैं एक n00b था! Thanx :) – vicky5G

17

आर्मेन के अच्छे जवाब के अलावा होगा, तो आप इस का पता लगाने के signbit उपयोग करना चाहिए। ऐसा करने से endian मुद्दों से बचाने होगा: छोटे रूप में फिर से लिखा समारोह के

#include <iostream> 
#include <cmath> 

int main() 
{ 
    std::cout << std::signbit(0.0) << '\n'; 
    std::cout << std::signbit(-0.0) << '\n'; 
} 

0 
1 
0

एक ही तरह:

static inline unsigned bool signbit(double& d) 
{ 
    return (((unsigned char*)&d)[sizeof(double)-1] & 0x80) != 0; 
} 


int EstimateDoubleBufferSize(double& d) 
{ 
    int len = 0; 

    if(signbit(d)) //if (d < 0) 
    { 
     d = -d; 
     len++; 
    } 
    d += 0.0000005; 

    int m = (int) log10(d); 

    if(m < 0) 
     m = 1; // 0.xxxx - include 0 
    else 
     m++; // Include first character 

    len += m + 1 /*dot*/ + 6 /* precision after . */; 
    return len; 
} 

इसके अलावा, मैं माइक्रोसॉफ्ट सी ++ संकलक sprintf आकार यह पता लगाने की जरूरत है - उस के लिए समारोह के रूप में अच्छी तरह से शामिल ।