2013-09-29 70 views
1

我需要將浮點數轉換爲以下非標準格式: 「一個浮點數F(採用標準十進制指數格式),後跟字符串 乘以10,power, 後跟一個整數K.」將浮點數轉換爲C(非標準格式)中的科學記數法?

有沒有辦法從e%或類似於frexp()函數中提取指數?

例如爲:3349.25應該是「3.34925乘以10的力量3」

+2

提供什麼樣的是缺乏一個更好的計劃爲例 – SKJ

+0

您預期的輸出,我可能''snprintf''float'使用'%e',然後簡單地使用你從中得到的字符串。這不是非常漂亮,但它會起作用。 – us2012

+1

一般說明:'10'的科學記數法指數將是原始數字的基數10的整數部分。那麼科學記數法「尾數」將是原來的數字除以10。您可以使用'%f'打印該部分。 – lurker

回答

3

您可以實現很容易frexp自己的十進制等效值。你需要的代碼看起來是這樣的:

int exponent = (int)log10(fabs(d)); 
double mantissa = d/pow(10, exponent); 
printf("%f X 10^%d\n", mantissa, exponent); 

首先我們把你的號碼的絕對值的10爲底的對數確定指數。 (我們需要fabs,因爲log10需要一個積極的論點。)演員陣容朝向零,這很方便,我們需要。然後,我們通過分割來標準化尾數。

這不處理d == 0(或無窮大或NaN),該部門將在結果中引入一些錯誤,並且我沒有用小數字或負數測試它,但是這應該會給你一些東西從開始。

+1

對於0和1之間的數字,向零舍入會給出錯誤的結果,例如, '(INT)日誌10(0.12)= 0'。樓層可能更適合 –

2

我喜歡OP方法,讓printf()使用"%e"格式來完成繁重工作。

很多問題與double到字符串轉換,現有的功能已經很好地處理。 (INF,Nan,-0,四捨五入,負數)。 OP的使用frexp(),power()通常具有接近於10的冪的四捨五入和有限精度的問題。

由於只給出了1個例子,OP的模糊程度是多少。 power(0.5, 100)需要100位數字。讓我們把它限制在DBL_DIG,而不是使用%e默認的6(這實在是7位,僅有6的DP之後。)

char *Heyhey_Notation(char *dest, double x) { 
    static const char Times[] = " times 10 to the power "; 
    char buffer[3 + DBL_DIG + sizeof(Times) + 20 + 1]; 

    sprintf(buffer, "%.*e", DBL_DIG, x); 
    char *e = strchr(buffer, 'e'); // find exponent position 
    if (e) { 
    char *zero = e; 
    while (zero[-1] == '0') zero--; 
    *zero = '\0'; // OP wants excess zeros trimmed. 
    int power = atoi(&e[1]); // trim excess zeros by converting to int 
    sprintf(dest, "%s%s%d", buffer, Times, power); 
    } 
    else { 
    strcpy(dest, buffer); 
    } 
    return dest; 
} 

int main() { 
    char buf[100]; 
    puts(Heyhey_Notation(buf, 3349.25)); 
    puts(Heyhey_Notation(buf, -0.0)); 
    puts(Heyhey_Notation(buf, 123)); 
    puts(Heyhey_Notation(buf, -1234567890.0/9999999999.0)); 
    puts(Heyhey_Notation(buf, -1/0.0)); 
    puts(Heyhey_Notation(buf, atof("nan"))); 
    return 0; 
} 

3.34925 times 10 to the power 3 
-0. times 10 to the power 0 
1.23 times 10 to the power 2 
-1.23456789times 10 to the power -1 
-inf 
nan 
+0

感謝您提供詳細信息,但我只需要以不同的格式編寫浮動內容,而來自pburka的回答很好。 – redundant6939

+0

@Heyhey Heyhey認爲你想要「3.34925 X 10^3」作爲_posted_而不是「3.349250 X 10^3」。除了0.0的麻煩,用| input | <1.0另一種方法給出了0的前導數字。很高興另一種解決方案適合您 - 感謝您的贊成票, – chux

相關問題