2010-04-15 7 views
0

Le problème est que je veux afficher des nombres à virgule flottante compatibles avec Mathematica. La seule différence avec le format standard iostream ou sortie printf est que la e exponentielle est remplacé par *^:Comment générer des nombres à virgule flottante avec un format de sortie personnalisé en C++?

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

est-il un moyen de manipuler les cours d'eau pour obtenir cet effet? Mon idée originale était simplement d'utiliser istringstream et de le vider dans une chaîne, puis de remplacer tous les e. Je serais également d'accord si quelqu'un postait du code pour analyser les bits du nombre à virgule flottante et le sortir directement (c'est-à-dire un remplacement printf("%e")).

+0

Si vous Si vous essayez juste de lire ceci dans Mathematica, il peut certainement gérer le format e +. Par exemple, 'ReadList [, Number]' les convertira de manière appropriée. – Cascabel

+0

Je préfère ne pas utiliser ReadList car je fais beaucoup de copier et de coller rapidement à la volée dans Mathematica (sauvegarder les données dans un fichier serait une perte de temps). J'ai eu des problèmes similaires dans le passé où le format cible n'était pas Mathematica. Je suis à la recherche d'un moyen de manipuler le format standard. –

+0

Ah, c'est juste. Je pensais juste que je le lancerais là-bas. – Cascabel

Répondre

0

Votre idée devrait fonctionner facilement:

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; 
} 
+0

Cela a répondu à votre question? – Danvil

+0

Ouais, j'attendais quelque chose de mieux, mais je suppose que ce n'est pas possible. –

0

printf avec% f ne doit pas utiliser la notation scientifique du tout. Y at-il une raison pour laquelle vous devez utiliser cette notation et ne pas simplement afficher une chaîne assez longue pour toutes les figures significatives?

0

Cela ne veut pas utiliser les flux comme l'OP demandé, néanmoins l'utilisation frexp() fonctionne pour moi:

#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 
} 

Cela traduit simplement le numéro à l'aide d'un exposant au lieu de base 2 10.

Questions connexes