2012-06-16 2 views
4

float (또는 double) f를 인쇄하려면 C/C++ 내에서 가능성이있는 것으로 말합니다 (예 : f = 1.234e-15). 지수가 "e"대신 "* 10 ^"로 표시되도록 플로트 인쇄

  • 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

    문자열 파싱을 사용하지 않는 이유는 무엇입니까? 문자열을 스캔하고 e를 10 ^로 바꿉니다.

    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() 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 :

    는 당신의 도움에 대해 감사하여 훨씬 더 간단 솔루션을 선호 : 코드는 이제 다음과 같은 방법을 보인다! 알렉스

    관련 문제