programacion - punto flotante informatica
C: convierte el doble en flotante, conservando la precisiĆ³n del punto decimal (3)
Los números de punto 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 Wikipedia:
Quería convertir el doble para flotar en C, pero quería preservar el punto decimal exactamente como fuera posible sin ningún cambio ...
por ejemplo, digamos que tengo
double d = 0.1108;
double dd = 639728.170000;
double ddd = 345.2345678
ahora corríjame si estoy equivocado, sé que la precisión de punto flotante es 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? para que lo anterior resulte como sigue:
float f = x(d);
float ff = x(dd);
float fff = x(ddd);
printf("%f/n%f/n%f/n", f, ff, fff);
debería imprimir
0.1108
639728.17000
345.23456
todos los dígitos después del límite de precisión (que asumo como 5) se truncarían.
Un float
generalmente tiene aproximadamente 7 dígitos de precisión, independientemente de la posición del punto decimal. Entonces, si quieres 5 dígitos de precisión después del decimal, deberás limitar el rango de los números a menos de alrededor de +/- 100.
float
y double
no almacenan decimales. Almacenan lugares binarios : float
es (asumiendo IEEE 754) 24 bits significativos (7.22 dígitos decimales) y el doble es 53 bits significativos (15.95 dígitos significativos).
Convertir de double
a float
le dará el float
más cercano posible, por lo que el redondeo no lo ayudará. Ir a la otra dirección 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 double
aproximación al valor decimal agradable que pretendía, 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);
}