2010-02-15 36 views

回答

7

您採取的方法將取決於值的可能範圍。您當然對可能的範圍有一些內部知識,並且您可能只對更窄範圍內的轉換感興趣。

所以,假設你只對整數值感興趣。在這種情況下,我只需將號碼分配給intlong,此時問題就變得相當明顯。或者,假設範圍不包含任何大指數,但您對小數部分的數字感興趣。要得到三位數的分數,我可以說int x = f * 1000;,轉換x,然後插入小數點作爲字符串操作。

如果上述失敗,浮點數或雙精度浮點數或符號位都有符號位,分數和指數。分數中有一個隱藏的1。 (這些數字被歸一化,直到它們沒有前導零爲止,此時他們再進行一次移位以獲得額外的精度。)數字等於分數(加上前導'1')* 2 **指數。幾乎所有使用IEEE 754表示的系統都可以使用this Wikipedia IEEE 754 page來了解格式。這不是與剛轉換整數不同。

對於單精度,一旦你的指數和分數,該值注數1然後(FRAC/2 + 1)* 2 EXP,或壓裂* 2 EXP - 23 + 2 exp

這裏是一個應該讓你開始一個有用的轉換的示例:

$ 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 

注1:在這種情況下,如果二進制點是在右側,而不是部分正在轉換左邊,然後對指數和隱藏位進行補償調整。

0

即使在嵌入式系統中,您也很難擊敗ftoa的性能。爲什麼重新發明輪子?

+3

'ftoa'可能實際上並不在所提供的庫中可用。畢竟,它不是標準庫的一部分,即使它是嵌入式系統,也可以使用獨立實現來省略大部分標準庫。 – 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; 
} 
相關問題