-16, 1 65 536 (0.0000153...). , , . , , -32 -53. ( ln2(DBL_EPSILON)) -
[Edit2] -17, -18 .. . . .
if (decpart > 1) → if (decpart >= 1).
[]
C DBL_MIN_10_EXP -37 pow(2, count) count int -80 +80.
FP, , N ( "101.101" - 6). N - 1/DBL_EPSILON 8 9 . , @Drew McGowen .
[Edit2]
double N 16 17. , while (decpart > 0 && count > -16). , FP "101.111" ( 101.111000000000004...) , 101.111000000000001111111...
( 101 + 1 * 1/2 + 1 * 1/4 + 1 * 1/8 + 1 * pow (2, -15) + 1 * pow (2, -16)))... = 5.875061
..... decimal() , log10(1/DBL_EPSILON) 15,16 , . 16 1 65 536 (0,000015...). , , (, @Drew McGowen, @BLUEPIXY).
double BinaryFloatinPoint(const char *s) {
double sum = 0.0;
double power = 1.0;
char dp = '.';
while (*s) {
if (*s == '0' || *s == '1') {
sum *= 2.0;
sum += *s - '0';
power *= 0.5;
} else if (*s == dp) {
dp = '0';
power = 1.0;
} else {
return 0.0;
}
s++;
}
if (dp == '0') {
sum *= power;
}
return sum;
}