C: конвертировать double в float, сохраняя десятичную точку точности
Я хотел преобразовать double в float в C, но хотел бы сохранить десятичную точку как можно точнее без каких-либо изменений...
например, допустим, что у меня есть
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) будут усечены.
Ответы
Ответ 1
float
и double
не хранить десятичные знаки. Они хранят двоичные места: float
(при условии, что IEEE 754) 24 значащих бита (7.22 десятичных разряда), а double - 53 значащих бита (15.95 значащих цифр).
Преобразование из 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);
}
Ответ 2
A float
обычно имеет около 7 цифр точности, независимо от положения десятичной точки. Поэтому, если вам нужно 5 цифр точности после десятичной дроби, вам нужно ограничить диапазон чисел меньше чем где-то около +/- 100.
Ответ 3
Числа с плавающей запятой представлены в научной нотации как число из семи значащих цифр, умноженное на большее число, которое представляет собой место десятичной точки.
Дополнительная информация об этом в Википедии:
http://en.wikipedia.org/wiki/Floating_point