C: конвертировать double в float, сохраняя точность десятичной точки - PullRequest
17 голосов
/ 17 августа 2010

я хотел преобразовать double в плавающее в 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) будет усечен.

Ответы [ 3 ]

28 голосов
/ 17 августа 2010

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);
}
11 голосов
/ 17 августа 2010

A float обычно имеет около 7 цифр точности, независимо от положения десятичной точки.Поэтому, если вы хотите получить 5 цифр точности после десятичной запятой, вам нужно ограничить диапазон чисел меньше, чем где-то около +/- 100.

0 голосов
/ 17 августа 2010

Числа с плавающей запятой представлены в научных обозначениях в виде числа только из семи значащих цифр, умноженных на большее число, представляющее место после запятой. Больше информации об этом в Википедии:

http://en.wikipedia.org/wiki/Floating_point

...