打印浮点数,使指数标记为“* 10 ^”而不是“e”

时间:2012-06-16 08:03:11

标签: c++ c floating-point representation

我正在寻找在C / C ++中打印浮点(或双倍)f的可能性,比如说f = 1.234e-15,这样它就会被打印为

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

任何人都可以帮助我吗?也许有一种方法可以在基数10中得到指数“-15”和尾数“1.234”。我发现了问题how can I extract the mantissa of a double,但不幸的是,这并没有真正帮助,因为它只得到基数2的尾数。

4 个答案:

答案 0 :(得分: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 :(得分:2)

为什么不使用字符串解析?扫描字符串并用10 ^替换e。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

在等待你的解决方案时,我提出了以下想法:

使用sprintf()将float或double打印到char数组。解析这个以得到指数和尾数。代码现在看起来如下:

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更简单的解决方案:)

谢谢大家的帮助!

亚历