2012-06-16 118 views
4

我正在尋找C/C++內部打印浮點數(或雙精度浮點數)f的可能性,如f = 1.234e-15,以便將其打印爲打印浮點數,使指數標記爲「* 10 ^」而不是「e」

  • f = 1.234*10^-15,或者甚至更好,因爲
  • f = 1.234*10^{-15}

誰能幫助我?也許有一種方法可以獲得基數爲10的指數「-15」和尾數「1.234」。我發現問題how can I extract the mantissa of a double,但不幸的是,這並沒有真正的幫助,因爲它只獲得基數爲2的尾數。

+0

似乎像log10四捨五入(不知何故)會讓你指數。應該很簡單,只要你有這個尾數就可以得到尾數。 – Lalaland

+1

@EthanSteinberg:這不是那麼簡單,取決於你是否想要全部的精度。 –

+3

沒有「C/C++」這樣的語言,而且這兩種語言的答案有很大的不同。 –

回答

8

您可以使用輸出字符串流打印到string,然後將"e"替換爲"*10^"

ostringstream ss; 
ss << scientific << 123456789.87654321; 
string s = ss.str(); 
s.replace(s.find("e"), 1, "*10^"); 
cout << s << endl; 

這個片段produces

1.234568*10^+08 
+1

非常感謝!我不知道字符串方法replace()和find()。以爲我需要用一些正則表達式庫來代替'e',而這看起來很複雜。您的解決方案非常短,我喜歡。在等待回覆時,我實際上編寫了自己的代碼,請參閱下面的內容...... – alex

2

爲什麼不使用字符串解析?掃描字符串並用10 ^替換e。

2
#include <cmath> 
#include <iostream> 

using namespace std; 

template <typename F> 
F round_away_from_zero (F x) 
{ 
    return x < 0 ? floor(x) : ceil(x); 
} 

template <class O, typename F> 
O &print_float (O &out, F f) { 
    signed ex = round_away_from_zero(log10(f)); // exponent 
    F mant = f/pow(10, ex);     // mantissa 
    out << mant << "*10^" << ex; 
} 

int main() { 
    double f = 1.234e-15; 
    print_float(cout, f) << endl; // prints 1.234*10^-15 
    return 0; 
} 
+1

謝謝!也是很好的數學方法來獲得指數和尾數!很容易將我的支架包含在輸出中。現在我也知道floor()和ceil():)) – alex

+0

剛剛在代碼中發現了一個小錯誤:在print_float()中,必須取abs(f)的log10,否則結果對於負f 。但是,這個小小的改變也適用於負數。 – alex

0

在等待您的解決方案,我想出了以下的想法:

用sprintf()打印float或double到一個數組的字符。解析這個來獲得指數和尾數。代碼現在看起來方式如下:

void printDoubleToChar(double d, char* c){ 
    char valAsChar[256]; 

    sprintf(valAsChar, "%.12e", d); 

    int expStart = 0, expWidth = 0; 
    for(int i=0; i<sizeof(valAsChar); i++){ 
     if(valAsChar[i] == 'e'){ 
      expStart = i+1; 
      break; 
     } 
    } 
    for(int i=expStart; i<sizeof(valAsChar); i++){ 
     if(valAsChar[i] == '\0'){ 
      expWidth = i - expStart; 
      break; 
     } 
    } 

    char chValExp[32]; 
    memcpy(chValExp, &valAsChar[expStart], expWidth+1); 

    char chValMan[128]; 
    memcpy(chValMan, valAsChar, expStart-1); 
    chValMan[expStart-1] = '\0'; 

    sprintf(c, "%s*10^{%s}", chValMan, chValExp); 
} 

int main(){ 
    double myNewDbl = 3.95743e-5; 
    char chDbl[256]; 
    printDoubleToChar(myNewDbl, chDbl); 
    printf("\nchDbl: %s\n", chDbl); // output: chDbl: 3.957430000000*10^{-05} 
} 

但說實話,我通過dasblinkenlight :)

謝謝大家的幫助更喜歡更簡單的解決方案!

亞歷克斯