2010-02-15 17 views

Respuesta

7

El enfoque que tome dependerá de la posible gama de valores. Ciertamente tiene algún conocimiento interno del rango posible, y es posible que solo le interesen las conversiones dentro de un rango más estrecho.

Así, supongamos que sólo está interesado en el valor entero. En este caso, simplemente asignaría el número a int o long, momento en el que el problema se vuelve bastante obvio.

O, supongamos que el rango no incluirá ningún exponentes grandes pero están interesados ​​en varios dígitos de fracción. Para obtener tres dígitos de fracción, podría decir int x = f * 1000;, convertir x, y luego insertar el punto decimal como una operación de cadena.

A falta de todo lo anterior, un flotador o doble tiene un bit de signo, una fracción, y un exponente. Hay un 1 oculto en la fracción. (Los números se normalizan hasta que no tienen ceros a la izquierda, momento en el que hacen un cambio más para obtener un poco más de precisión.) El número es entonces igual a la fracción (más un exponente '1') * 2 ** . Básicamente, todos los sistemas que utilizan la representación IEEE 754 pueden usar this Wikipedia IEEE 754 page para comprender el formato. No es que es diferente de simplemente convertir un número entero.

Para precisión simple, una vez que el exponente y la fracción, el valor Nota 1 del número es entonces (frac/2 + 1) * 2 exp o frac * 2 exp - 23 + 2 exp.

Aquí es un ejemplo que debe empezar en una conversión útil:

$ cat t.c 
#include <stdio.h> 

void xconvert(unsigned frac) 
{ 
    if (frac) { 
    xconvert(frac/10); 
    printf("%c", frac % 10 | '0'); 
    } 
} 

void convert(unsigned i) 
{ 
    unsigned sign, exp, frac; 

    sign = i >> 31; 
    exp = (i >> (31 - 8)) - 127; 
    frac = i & 0x007fffff; 
    if (sign) 
    printf("-"); 
    xconvert(frac); 
    printf(" * 2 ** %d + 2 ** %d\n", exp - 23, exp); 
    printf("\n"); 
} 

int main(void) 
{ 
    union { 
    float f; 
    unsigned i; 
    } u; 

    u.f = 1.234e9; 
    convert(u.i); 
    return 0; 
} 
$ ./a.out 
1252017 * 2 ** 7 + 2 ** 30 

Nota 1. En este caso, la fracción se convierte como si el punto binario estaba en el lugar correcto de la izquierda, con ajustes de compensación realizados en el exponente y el bit oculto.

0

Incluso en un sistema embebido, te será difícil de superar el rendimiento de ftoa. ¿Por qué reinventar la rueda?

+3

'ftoa' podría no estar realmente disponible en las bibliotecas proporcionadas. No es parte de la biblioteca estándar, después de todo, e incluso si lo fuera, no es raro que los sistemas incorporados utilicen implementaciones independientes que omitan gran parte de la biblioteca estándar. – jamesdlin

0
#include<stdio.h> 
void flot(char* p, float x) 
{ 
    int n,i=0,k=0; 
    n=(int)x; 
    while(n>0) 
    { 
    x/=10; 
    n=(int)x; 
    i++; 
} 
*(p+i) = '.'; 
x *= 10; 
n = (int)x; 
x = x-n; 
while(n>0) 
{ 
    if(k == i) 
     k++; 
    *(p+k)=48+n; 
    x *= 10; 
    n = (int)x; 
    x = x-n; 
    k++; 
} 
*(p+k) = ''; 
} 

int main() 
{ 
    float x; 
    char a[20]={}; 
    char* p=&a; 
    printf("Enter the float value."); 
    scanf("%f",&x); 
    flot(p,x); 
    printf("The value=%s",p); 
    getchar(); 
    return 0; 
} 
Cuestiones relacionadas