2014-01-16 55 views
1

我正在生成要用作FORTRAN輸入文件的文本文件。 Fortran程序指定它讀取值必須是一個格式,使得用C++打印一個前導零的指數表示法

1.0 

必須被打印爲

0.1000000E+01 

截至目前我已經在使用的iostream得到最接近的是

1.000000E+00 

與代碼

cout << setprecision(6) << fixed << scientific << uppercase; 
_set_output_format(_TWO_DIGIT_EXPONENT); 
cout << 1.0 << endl; 

有沒有人知道最好的方式來得到一個前導零如上所示,最好使用ostream而不是printf?

+1

如果我必須要迂腐,你的Fortran代碼要求是不科學的表示法。 –

+0

這是真的......但這是總結問題的最簡單的方法 – rhodysurf

+0

我擔心你必須自己寫一個函數,因爲這是非標準的,不幸的是。修補FORTRAN程序可能會更簡單嗎?或者那不是一個選擇? –

回答

1

就像我說的,你問什麼是非標準的,但你可以做到這一點了一招:因爲你不能爲double重新定義<<需要

#include <iostream> 
#include <iomanip> 
#include <cmath> 

class Double { 
public: 
    Double(double x): value(x) {} 
    const double value; 
}; 

std::ostream & operator<< (std::ostream & stream, const Double & x) { 
    // So that the log does not scream 
    if (x.value == 0.) { 
     stream << 0.0; 
     return stream; 
    } 

    int exponent = floor(log10(std::abs(x.value))); 
    double base = x.value/pow(10, exponent); 

    // Transform here 
    base /= 10; 
    exponent += 1; 

    stream << base << 'E' << exponent; // Change the format as needed 

    return stream; 
} 

int main() { 
    // Use it like this 
    std::cout << std::setprecision(6) << std::fixed; 
    std::cout << Double(-2.203e-15) << std::endl; 
    return 0; 
} 

Double包裝。

我沒考分離exponentbase對浮點的賠率是這樣,也許你能想出一個更好的選擇,但你的想法:)

+0

好C++的答案。過去我嘗試過這樣的方法來處理類似的問題,但是在值爲10的情況下遇到了麻煩。值0.9999999999e-10或1.00000000001-10會爲'exponent'和' base',尤其是'地板(日誌10 ...'一部分,你可能想嘗試這樣的測試用例。 – chux

+0

@chux要是有'在C/C++標準庫frexp10' ... –

+0

我查看緩存verison。出於某種原因,第一個if語句其中'X == 0'是告訴我,沒有運營商這些操作數 – rhodysurf

-1
printf ("%2.2f %+.0e %E \n", 2.016, 1.226, 0.1416); 

輸出:2.02 + 1E + 000 1.416000E-001

+0

這些都沒有前導零。 – godel9

1

Ç認爲:

不是一個偉大的答案因爲C++答案優選的。

char buf[20]; 
buf[0] = ' '; 
double x = -1.234567; 
sprintf(&buf[1], "% .6E", x*10); 
if (buf[3] == '.') { // detect if x was INF or NAN 
    buf[0] = buf[1]; 
    buf[1] = '0'; 
    buf[3] = buf[2]; 
    buf[2] = '.'; 
} 

// Cope with leading potential space if needed 
if (buf[0] == ' ') memmove(&buf[0], &buf[1], strlen(buf)); 

printf("%s\n", buf); 
// -0.1234567E+00 

弱點:麻煩小數點不是'。'或INF附近的x。

0
  1. 創建一個語言環境方面是打印沒有小數點,並灌輸它。
  2. cout << "0." << setprecision(6) << fixed << scientific << uppercase << number * 10;
+0

這個工作,但似乎效率較低,設置和重置ios標誌爲每個打印的號碼 – rhodysurf

+0

這將打印「 - 」標誌後的「0.」? – chux

+0

我認爲你可以調用'.write(「0。」,2)'而不是<<,並且不會一直重置所有內容。 –