2010-08-16 10 views
17

que quería convertir el doble de flotar en C, pero quería conservar el punto decimal exactamente como sea posible sin ningún cambio ...C: convertir el doble de flotar, preservando punto de precisión decimal

por ejemplo, digamos que tener

double d = 0.1108; 
    double dd = 639728.170000; 
    double ddd = 345.2345678 

ahora corrígeme si estoy equivocado, sé que la precisión del punto flotante es de aproximadamente 5 números después del punto. ¿Puedo obtener esos cinco números después del punto exactamente como lo tenía el doble? de modo que los resultados anteriores como sigue:

float f = x(d); 
    float ff = x(dd); 
    float fff = x(ddd); 

    printf("%f\n%f\n%f\n", f, ff, fff); 

debe imprimir

0.1108 
    639728.17000 
    345.23456 

todos los dígitos después del límite de precisión (que supongo como 5) podrían truncarse.

+8

Precisión de punto flotante se afirma con más precisión como 'número de dígitos significativos' en lugar de 'serie de dígitos después del lugar decimal '. 12345678.12345 lo más probable es que no sea representable de forma particularmente precisa mediante un flotador. –

+8

Aparte del malentendido con respecto a la representación de los números de punto flotante que se han comentado y respondido, la función 'x' que está buscando es el molde de doble a flotar' (float) '. Si no cambió el modo de redondeo de su valor predeterminado de "más cercano", esta conversión calcula el 'flotante 'que está más cerca del' doble' que está convirtiendo. No hay mejor conversión que esta, por lo que si esta pierde demasiada precisión para su gusto, mantenga sus "dobles" tal como están. –

+2

El truncamiento no es la forma más precisa de convertirlos: 345.2345678 está más cerca de 345.23457 que de 345.23456 – caf

Respuesta

26

float y double no almacenan cifras decimales. Almacenan binario lugares: float es (suponiendo IEEE 754) 24 bits significativos (7.22 dígitos decimales) y el doble es de 53 bits significativos (15.95 dígitos significativos).

Conversión de double a float le dará lo más cercano posible float, por lo que el redondeo no le ayudará. Ir por el otro lado puede darle dígitos de "ruido" en la representación decimal.

#include <stdio.h> 

int main(void) { 
    double orig = 12345.67; 
    float f = (float) orig; 
    printf("%.17g\n", f); // prints 12345.669921875 
    return 0; 
} 

Para obtener una aproximación double al valor decimal agradable que fue diseñado, usted puede escribir algo como:

double round_to_decimal(float f) { 
    char buf[42]; 
    sprintf(buf, "%.7g", f); // round to 7 decimal digits 
    return atof(buf); 
} 
+0

@davidvandebunte: Eso solo está en C++. La pregunta está etiquetada como C. – dan04

11

A float generalmente tiene aproximadamente 7 dígitos de precisión, independientemente de la posición del punto decimal. Entonces, si quiere 5 dígitos de precisión después del decimal, deberá limitar el rango de los números a menos de alrededor de +/- 100.

-1

Los números de coma flotante se representan en notación científica como un número de solo siete dígitos significativos multiplicados por un número mayor que representa el lugar del lugar decimal. Más información al respecto en la Wikipedia:

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

Cuestiones relacionadas