2010-08-16 21 views
17

मैं, सी में फ्लोट करने के लिए डबल कन्वर्ट करने के लिए चाहता था, लेकिन बिना किसी परिवर्तन के बिल्कुल संभव के रूप में दशमलव बिंदु संरक्षित करने के लिए चाहता था ...सी:, फ्लोट करने के लिए डबल परिवर्तित दशमलव बिंदु परिशुद्धता संरक्षण

उदाहरण के लिए

, चलो मैं मान लीजिए ,

double d = 0.1108; 
    double dd = 639728.170000; 
    double ddd = 345.2345678 

अब मुझे ठीक कर लें मैं गलत हूँ मुझे पता है कि चल बिन्दु परिशुद्धता डॉट के बाद के बारे में 5 संख्या है। क्या मैं डॉट के बाद उन पांच नंबरों को ठीक कर सकता हूं जैसे डबल था? इतनी के रूप में है कि ऊपर दिए गए परिणामों इस प्रकार है:

float f = x(d); 
    float ff = x(dd); 
    float fff = x(ddd); 

    printf("%f\n%f\n%f\n", f, ff, fff); 

यह

0.1108 
    639728.17000 
    345.23456 

परिशुद्धता सीमा के बाद सभी अंक (जो मैं 5 के रूप में मानते हैं) छोटा किया जा जाएगा प्रिंट चाहिए।

+8

चल बिन्दु परिशुद्धता और अधिक सही रूप में 'सार्थक अंकों की संख्या' कहा गया है के बजाय 'नंबर दशमलव स्थान के बाद अंकों का '। 12345678.12345 अधिकतर फ्लोट द्वारा विशेष रूप से सटीक रूप से प्रस्तुत नहीं किया जा सकता है। –

+8

फ़्लोटिंग-पॉइंट नंबरों के प्रतिनिधित्व के बारे में गलतफहमी के अलावा, जिस पर टिप्पणी की गई है और उत्तर दिया गया है, आप जिस फ़ंक्शन 'एक्स' की तलाश में हैं, वह दोहरी से फ्लोट' (फ्लोट) 'है। यदि आपने गोलिंग मोड को अपने निकटतम से भी नहीं बदला है, तो भी यह कास्ट 'फ्लोट' की गणना करता है जो कि आप 'डबल' के सबसे नज़दीक हैं जो आप परिवर्तित कर रहे हैं। इस से कोई बेहतर रूपांतरण नहीं है, इसलिए यदि यह आपके स्वाद के लिए बहुत अधिक सटीकता खो देता है, तो अपने 'डबल' को उनके जैसा रखें। –

+2

छंटनी उन्हें परिवर्तित करने का सबसे सटीक तरीका नहीं है - 345.2345678 345.23457 के करीब 345.23456 – caf

उत्तर

26

float और double दशमलव स्थानों की दुकान नहीं है। वे बाइनरी स्थान: float (आईईईई 754 मानते हैं) 24 महत्वपूर्ण बिट्स (7.22 दशमलव अंक) और डबल 53 महत्वपूर्ण बिट्स (15.9 5 महत्वपूर्ण अंक) हैं।

double से float में कनवर्ट करने से आपको निकटतम संभव float मिल जाएगा, इसलिए गोल करने से आपकी मदद नहीं होगी। दूसरी तरफ जाने से आप दशमलव प्रतिनिधित्व में "शोर" अंक दे सकते हैं।

#include <stdio.h> 

int main(void) { 
    double orig = 12345.67; 
    float f = (float) orig; 
    printf("%.17g\n", f); // prints 12345.669921875 
    return 0; 
} 

अच्छा दशमलव मान आप का इरादा करने के लिए एक double सन्निकटन पाने के लिए आपको कुछ ऐसा लिख ​​सकते हैं:

double round_to_decimal(float f) { 
    char buf[42]; 
    sprintf(buf, "%.7g", f); // round to 7 decimal digits 
    return atof(buf); 
} 
+0

@ डेविडवंडेबेंट: यह केवल सी ++ में है। प्रश्न सी के रूप में टैग किया गया है – dan04

11

float में दशमलव बिंदु की स्थिति के बावजूद, सटीकता के लगभग 7 अंक होते हैं। तो यदि आप दशमलव के बाद परिशुद्धता के 5 अंक चाहते हैं, तो आपको संख्याओं की सीमा को +/- 100 के आसपास कहीं से कम करने की आवश्यकता होगी।

-1

फ़्लोटिंग पॉइंट नंबर वैज्ञानिक नोटेशन में दर्शाए जाते हैं क्योंकि दशमलव स्थान की जगह का प्रतिनिधित्व करने वाली बड़ी संख्या में केवल सात महत्वपूर्ण अंक गुणा किए जाते हैं। विकिपीडिया पर इसके बारे में अधिक जानकारी:

http://en.wikipedia.org/wiki/Floating_point