C: конвертировать двойной, чтобы поплавок, сохраняя точность десятичной точки

StackOverflow https://stackoverflow.com/questions/3498192

  •  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.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top