C: конвертировать двойной, чтобы поплавок, сохраняя точность десятичной точки
-
29-09-2019 - |
Вопрос
Я хотел конвертировать двойной, чтобы поплавок в 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) будут усечены.
Решение
float
и double
Не храните десятичные места. Они хранятся двоичный Места: float
Является (предполагая IEEE 754) 24 значимых бита (7,22 десятичных цифр) и двойной составляет 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);
}
Другие советы
А. float
Как правило, имеет около 7 цифр точности, независимо от положения десятичной точки. Поэтому, если вы хотите 5 цифр точности после десятичного периода времени, вам нужно ограничить диапазон чисел менее чем где-то около +/- 100.
Номера с плавающей точкой представлены в научном обозначении как ряд только семи значимых цифр, умноженные большим числом, которое представляет место десятичного времени. Больше информации об этом на Википедии: