2015-07-18 2 views
1

Ce qui suit est mon programme C++. Je veux stocker un nombre long tel que pi sur une variable, donc j'essaie d'utiliser long double. Mais quand je cours le programme il affiche seulement 3.14159. Comment stocker le nombre à virgule flottante complet à la variable?Utilisation du double long

#include <iostream> 
using namespace std; 

int main() { 
long double pi; 
pi = 3.14159265358979323846264338327950288419716939937510; 
cout << "PI = " << pi << endl; 
return 0; 
} 
+0

Vous stockez la valeur du point complet vous Floating tout simplement pas l'imprimer tout. Essayez 'cout << std :: setprecision (30) << pi << '\ n';' – Galik

Répondre

2

En utilisant Manipulateurs de flux, il est facile:

#include <iostream> 
#include <iomanip> 

int main() 
{ 

    long double pi; 
    pi = 3.14159265358979323846264338327950288419716939937510L; // L for long double literal 

    std::cout << "PI: " << std::setprecision(20) << pi; 


} 
+0

Et si je veux multiplier deux de ces nombres avec précision 20 – Mat

+2

Les données internes ne sont JAMAIS affectées par 'std :: setprecision '. Tout ce qu'il fait est de définir combien de chiffres sont imprimés. Vous pouvez facilement répéter un autre 'long double' par' pi' puis l'imprimer, tant que vous utilisez 'std :: setprecision' –

+0

lorsque j'essaie d'exécuter cette instruction if '\t if (i% k! = 0 && j% k! = 0) 'il est dit \t opérandes invalides de types' long double 'et' long double 'à binaire' opérateur% ' – Mat

1

Il n'y a pas de problème (en réalité, il y a un problème avec précision) dans le stockage de la valeur à long double. Le problème est avec l'impression.

Essayez ceci:

cout << "PI = " << setprecision(40) << pi << endl; 

Si vous essayez ce qui précède, vous constaterez que la valeur réellement imprimée commencera perte de précision après quelques décimales (18-25 je suppose) .La précision long double en c/C++ est mise en œuvre définie. Ainsi, vous devez vérifier votre système pour la plus grande précision possible.

1

Le problème ici est même long double a une précision limitée. Considérez ceci (C++11)

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <cmath> 
using namespace std; 

int main() { 
    cout.precision(51); 
    std::string pi("3.14159265358979323846264338327950288419716939937510"); 
    cout << pi << endl; 
    cout << stold(pi) << endl; 
    cout << M_PIl << endl;  /// The constant from <math.h> 
} 

Sortie

3.14159265358979323846264338327950288419716939937510 
3.14159265358979323851280895940618620443274267017841 
        ^value changes from here (18th decimal place) 
3.14159265358979323851280895940618620443274267017841