4

C/C++ 内で float (または double) f を出力する可能性を探しています。たとえばf = 1.234e-15、次のように出力されます。

  • f = 1.234*10^-15、または、さらに良いことに、
  • f = 1.234*10^{-15}

誰でも私を助けることができますか?基数 10 で指数 "-15" と仮数 "1.234" を取得する方法があるかもしれません。doubleの仮数をどのように抽出できるかという質問を見つけましたが、残念ながらそれは仮数のみを取得するため、実際には役に立ちませんでした。ベース2で。

4

4 に答える 4

8

string出力文字列ストリームを使用して に出力し、 に置き換える"e"ことができます"*10^"

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

このスニペットは生成します

1.234568*10^+08
于 2012-06-16T08:14:30.720 に答える
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;
}
于 2012-06-16T08:22:50.273 に答える
2

文字列解析を使用しないのはなぜですか? 文字列をスキャンし、e を 10^ に置き換えます。

于 2012-06-16T08:14:01.017 に答える
0

あなたの解決策を待っている間、私は次のアイデアを思いつきました:

float または double を char の配列に出力するには、sprintf() を使用します。これを解析して指数と仮数を取得します。コードは次のようになります。

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 によるよりシンプルなソリューションを好みます :)

ご協力ありがとうございました!

アレックス

于 2012-06-16T09:16:27.117 に答える