2 votes

C++ compter le nombre de chiffres d'un double

Je veux faire ce que le titre dit comme ceci :

int number1;
cin>>number1;
num1len=log10(number1)+1;
cout<<"num of digits is "<<num1len<<"\n";

mais lorsque le nombre de chiffres est de 11 et plus, la réponse est toujours 7(6+1)

Quelqu'un sait-il pourquoi ou qu'est-ce que je fais mal ?

8voto

Ben Voigt Points 151460

Types de données à virgule flottante, y compris double magasin approximations . Ce que vous trouvez en appelant log10 est le nombre de places à gauche du point décimal qui est affectée par au plus un par le processus d'approximation.

La question que vous avez posée, comment trouver le nombre de chiffres décimaux dans un nombre stocké en virgule flottante binaire, n'a pas de sens. Le nombre 7.1 a deux chiffres décimaux, mais sa représentation approximative en virgule flottante n'utilise pas du tout de chiffres décimaux. Pour conserver le nombre de chiffres décimaux, il faudrait une représentation décimale, et non le système C++. double type de données.

Bien sûr, tout ceci n'est applicable qu'à double selon le titre de la question. Votre extrait de code n'utilise pas réellement la fonction double .

4voto

icecrime Points 23650

Ce qui est "faux", c'est la valeur maximale qui peut être stockée dans un int (signé) :

#include <iostream>
#include <numeric>

int main()
{
    std::cout << std::numeric_limits<int>::max() << std::endl;
}

Il me donne :

2147483647

2voto

Will Points 1164

Vous dépassez la limite des 32 bits non signés ... votre nombre de 11 chiffres ou plus dépasse 0xFFFFFFFF, et ainsi de suite.

Vous devez utiliser soit unsigned long long o double pour votre number1 variable :

#include <iostream>
#include <cstdlib>
#include <cmath>

int
main ( int argc, char * argv[] )
{
  unsigned long long num; // or double, but note comments below
  std::cin >> num;
  std::cout << "Number of digits in " << num << " is " << ( (int) std::log10 ( num ) + 1 ) << std::endl;
  return 0;
}

Ces grands nombres seront imprimés en notation scientifique par défaut lorsque vous les enverrez à l'adresse suivante std::cout si vous choisissez d'utiliser double en tant que type de données, ce qui vous permettra de procéder à une mise en forme. Si vous utilisez un unsigned long long à la place, ils s'imprimeront tels qu'ils ont été saisis, mais vous devez être sûr que votre plateforme supporte unsigned long long .

EDIT : Comme mentionné par d'autres, l'utilisation de valeurs à virgule flottante a d'autres implications à prendre en compte, et n'est très probablement pas ce que vous essayez d'obtenir en fin de compte. A ma connaissance, le type d'intégrale sur une plateforme qui donne la plus grande valeur positive est unsigned long long En fonction des valeurs avec lesquelles vous souhaitez travailler, voyez si vous pouvez les utiliser.

0voto

Vatsan Points 1113

D'autres ont fait remarquer que les nombres à virgule flottante sont approximations Il n'est donc pas possible d'obtenir un nombre précis de chiffres.

Mais... vous pouvez obtenir quelque chose d'approximatif, en l'écrivant dans un objet std::stringstream, puis en le convertissant en std::string, et en obtenant la longueur de ladite chaîne. Vous devrez bien sûr tenir compte du fait qu'il peut y avoir des caractères non numériques dans la chaîne (comme le signe moins, le point décimal, E pour l'exposant, etc.) Le nombre de chiffres que vous obtenez de cette manière dépend également des options de formatage que vous choisissez lorsque vous écrivez dans l'objet stringstream. Mais en supposant que vous connaissez les options de formatage que vous souhaitez utiliser, vous pouvez obtenir le nombre de chiffres en fonction de ces options.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X