C प्रोग्रामिंग भाषा में, float फ्लोटिंग पॉइंट का संक्षिप्त रूप है।
- फ्लोटिंग पॉइंट संख्याएं आमतौर पर IEEE 754 फॉर्मेट (इंस्टीट्यूट ऑफ इलेक्ट्रिकल एंड इलेक्ट्रॉनिक्स इंजीनियर्स) में दर्शाई जाती हैं।
- IEEE फॉर्मेट एक साइन बिट, एक मैंटिसा (मैट्रिक्स/सिग्निफिकेंड), और एक एक्सपोनेंट (2 की घात के लिए) का उपयोग करता है।
- साइन बिट संख्या का चिह्न दर्शाता है: 0 = धनात्मक, 1 = ऋणात्मक।
- मैंटिसा बाइनरी में निरूपित होती है, सामान्यीकृत (normalized) रूप में परिवर्तित होने के बाद। सामान्यीकरण के बाद, सबसे महत्वपूर्ण अंक हमेशा 1 होता है (इम्प्लिसिट/हिडन बिट)।
- एक्सपोनेंट एक इंटीजर है जो अनसाइन्ड बाइनरी फॉर्मेट में संग्रहीत होता है, एक धनात्मक इंटीजर बायस जोड़ने के बाद।
- यह सुनिश्चित करता है कि संग्रहीत एक्सपोनेंट हमेशा धनात्मक हो।
- float (32-बिट) के लिए, बायस 127 है। double (64-बिट) के लिए, बायस 1023 है।
IEEE 754 सिंगल प्रिसिजन (float, 32-बिट) लेआउट
| S (1 bit) | Exponent (8 bits) | Mantissa (23 bits) | | 31 | 30 - 23 | 22 - 0 |
- मान = (-1)^S × 1.M × 2^(E-127)
- विशेष मान: E=0 (डीनॉर्मलाइज़्ड/शून्य), E=255 (इन्फिनिटी/NaN)
उदाहरण: 37.66666 को 4 दशमलव स्थानों तक राउंड करना
#include <stdio.h>
int main() {
float var = 37.66666f;
printf("%.4f\n", var); // 4 दशमलव स्थानों तक राउंडिंग
return 0;
}
आउटपुट
37.6667
उदाहरण: 8 दशमलव स्थानों तक (फ्लोट प्रिसिजन सीमा दिखाता है)
#include <stdio.h>
int main() {
float var = 78.67f;
printf("%.8f\n", var);
return 0;
}
आउटपुट
78.66999817
व्याख्या: 78.67 को बाइनरी में सटीक रूप से दर्शाया नहीं जा सकता। फ्लोट में ~7 दशमलव अंकों की प्रिसिजन होती है, इसलिए 8वें स्थान पर राउंडिंग आर्टिफैक्ट्स दिखाई देते हैं।
IEEE 754 प्रतिनिधित्व उदाहरण
37.66666 का प्रतिनिधित्व:
37.66666 = 100101.101010101010101... (बाइनरी) Normalized: 1.00101101010101010101010 × 2^5 Sign: 0 Exponent: 5 + 127 = 132 = 10000100 (बाइनरी) Mantissa: 00101101010101010101010 (23 बिट्स) Hex: 0x4215AAAA
Float vs Double प्रिसिजन
| प्रकार | आकार | प्रिसिजन (दशमलव अंक) | एक्सपोनेंट रेंज | बायस |
|---|---|---|---|---|
| float | 4 बाइट्स (32-बिट) | ~6-7 | ±3.4×10^38 | 127 |
| double | 8 बाइट्स (64-बिट) | ~15-16 | ±1.7×10^308 | 1023 |
| long double | 16 बाइट्स (आमतौर पर 80-बिट एक्सटेंडेड) | ~18-19 | ±1.1×10^4932 | 16383 |
सामान्य समस्याएं
- फ्लोटिंग पॉइंट तुलना:
if(a == b)के बजायif(fabs(a-b) < epsilon)उपयोग करें। - धन संचालन: फ्लोट का उपयोग न करें; इंटीजर सेंट्स या डेसिमल लाइब्रेरी उपयोग करें।
- संचय त्रुटि: लूप में बार-बार जोड़ने से त्रुटि जमा होती है (Kahan समेशन उपयोग करें)।