如何在C ++中使用自定义输出格式输出浮点数?

时间:2010-04-15 19:58:46

标签: c++ floating-point iostream

问题是我想输出Mathematica兼容的浮点数。标准IOStream或printf输出格式的唯一区别是指数e*^替换:

Standard C/C++ output format: 1.23e-4
Mathematica format: 1.23*^-4

有没有办法操纵流来实现这种效果?我最初的想法是使用istringstream并将其转储为字符串,然后替换所有e。如果有人发布代码来解析浮点数的位并直接输出它(即printf("%e")替换),我也会没事的。

3 个答案:

答案 0 :(得分:0)

你的想法应该很容易解决:

std::string FloatToStringMathematica(float x) {
  std::stringstream a;
  a << x;
  std::string u = a.str();
  size_t pos = u.find("e");
  if(pos != std::string::npos) {
    u.replace(p, 1, "*^"); 
  }
  return u;
}

答案 1 :(得分:0)

带有%f的printf根本不应该使用科学记数法。是否有一些原因你必须使用这种表示法,而不是简单地输出足够长的字符串以适合所有有效数字?

答案 2 :(得分:0)

这并没有像我们要求的那样使用流,但使用frexp()对我有效:

#include <cmath>
#include <limits>
#include <iostream>
using namespace std;

// Print x for import to Mathematica
void cout_print(double x)
{
    int exp;
    cout << frexp( x, &exp );
    if( exp ) cout << "*2^" << exp;
}

int main()
{
    cout.precision(numeric_limits<double>::digits10);
    cout_print(3.25); // 0.8125*2^2
}

这只是使用base-2指数而不是10表示数字。