मैं निम्नलिखित काम करता है लगता है, लेकिन मैं पहले मेरी मान्यताओं की जानकारी मौजूद होगी :
- फ्लोटिंग प्वाइंट नंबर,
अपने कार्यान्वयन पर आईईईई-754 प्रारूप में जमा हो जाती है
- कोई ओवरफ़्लो,
- आपके पास
nextafterf()
उपलब्ध है (यह C99 में निर्दिष्ट है)।
इसके अलावा, सबसे अधिक संभावना है, यह विधि बहुत ही कुशल नहीं है।
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
/* Change to non-zero for superior, otherwise inferior */
int superior = 0;
/* double value to convert */
double d = 0.1;
float f;
double tmp = d;
if (argc > 1)
d = strtod(argv[1], NULL);
/* First, get an approximation of the double value */
f = d;
/* Now, convert that back to double */
tmp = f;
/* Print the numbers. %a is C99 */
printf("Double: %.20f (%a)\n", d, d);
printf("Float: %.20f (%a)\n", f, f);
printf("tmp: %.20f (%a)\n", tmp, tmp);
if (superior) {
/* If we wanted superior, and got a smaller value,
get the next value */
if (tmp < d)
f = nextafterf(f, INFINITY);
} else {
if (tmp > d)
f = nextafterf(f, -INFINITY);
}
printf("converted: %.20f (%a)\n", f, f);
return 0;
}
मेरी मशीन पर, यह प्रिंट:
Double: 0.10000000000000000555 (0x1.999999999999ap-4)
Float: 0.10000000149011611938 (0x1.99999ap-4)
tmp: 0.10000000149011611938 (0x1.99999ap-4)
converted: 0.09999999403953552246 (0x1.999998p-4)
विचार यह है कि मैं एक float
मूल्य — करने के लिए double
मूल्य परिवर्तित कर रहा हूँ इस से कम या उसके आधार पर डबल मूल्य से अधिक हो सकता है गोलाकार मोड। जब double
पर वापस परिवर्तित किया गया, तो हम जांच सकते हैं कि यह मूल मान से छोटा या बड़ा है या नहीं। फिर, यदि float
का मान सही दिशा में नहीं है, तो हम मूल संख्या की दिशा में परिवर्तित संख्या से अगले float
नंबर देखें।
स्रोत
2010-01-07 03:07:04
glibc सिस्टम पर आप एक हेडर फाइल ieee754.h है, जो चल बिन्दु प्रकार और एक bitfield संरचना के लिए यूनियनों को परिभाषित करता है लगता है, तो आप अपूर्णांश और प्रतिपादक आसान, खेद के साथ काम कर सकते हैं लेकिन मैं आपको असली नहीं दे सकता कोड। – quinmars