Как вывести числа с плавающей запятой с пользовательским форматом вывода в C ++? - PullRequest
0 голосов
/ 15 апреля 2010

Проблема в том, что я хочу вывести Mathematica-совместимые числа с плавающей запятой. Единственное отличие от стандартного формата вывода IOStream или printf состоит в том, что экспонента e заменяется на *^:

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

Есть ли способ манипулировать потоками для достижения этого эффекта? Моя первоначальная идея состояла в том, чтобы просто использовать istringstream и вывести его в строку, а затем заменить все e. Я также был бы в порядке, если бы кто-то отправил код, чтобы проанализировать биты числа с плавающей запятой и вывести его напрямую (т.е. замена printf("%e")).

Ответы [ 3 ]

0 голосов
/ 29 апреля 2010

printf с% f вообще не должны использовать научную запись. Есть ли какая-то причина, по которой вы должны использовать это обозначение, а не просто выводить достаточно длинную строку, чтобы уместить все значащие цифры?

0 голосов
/ 02 июня 2014

Это не использует потоки как запрошенный OP, но использование 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
}

Это просто выражает число, используя показатель степени 2 вместо 10.

0 голосов
/ 16 апреля 2010

Ваша идея должна сработать легко:

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;
}
...