Подтвердить что ты не робот

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) будут усечены.

4b9b3361

Ответ 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