我正在寻找在 C/C++ 中打印浮点(或双精度)f 的可能性f = 1.234e-15
,例如,它被打印为
f = 1.234*10^-15
, 或者, 甚至更好, 作为f = 1.234*10^{-15}
谁能帮我?也许有一种方法可以得到以 10 为底的指数“-15”和尾数“1.234”。我发现了如何提取 double 的尾数的问题,但不幸的是,这并没有真正帮助,因为它只得到尾数在基地 2。
我正在寻找在 C/C++ 中打印浮点(或双精度)f 的可能性f = 1.234e-15
,例如,它被打印为
f = 1.234*10^-15
, 或者, 甚至更好, 作为f = 1.234*10^{-15}
谁能帮我?也许有一种方法可以得到以 10 为底的指数“-15”和尾数“1.234”。我发现了如何提取 double 的尾数的问题,但不幸的是,这并没有真正帮助,因为它只得到尾数在基地 2。
您可以使用输出字符串流打印到 a 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
为什么不使用字符串解析?扫描字符串并将 e 替换为 10^。
#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;
}
在等待您的解决方案时,我想出了以下想法:
使用 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 提供的更简单的解决方案 :)
感谢大家的帮助!
亚历克斯