Pregunta

quiero hacer lo que el título dice así:

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

pero cuando el número de dígitos tiene 11 años y más, la respuesta es siempre 7(6+1)

¿Alguien sabe por qué o lo que estoy haciendo mal?

¿Fue útil?

Solución

¿Qué es 'equivocado' es el valor máximo que se puede almacenar en un int (firmado):

#include <iostream>
#include <numeric>

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

Me da:

  

2147483647

Otros consejos

tipos de datos de punto flotante, incluyendo double, tienda aproximaciones . Lo que estamos encontrando llamando log10 es el número de plazas a la izquierda de la coma decimal , que se ve afectada por como máximo uno por el proceso de aproximación.

La pregunta que hizo, cómo encontrar el número de dígitos decimales en un número guardado en binario de punto flotante, no tiene sentido. El 7.1 número tiene dos dígitos decimales, sin embargo, su representación aproximada de punto flotante no utiliza dígitos decimales en absoluto. Para conservar el número de dígitos decimales, que había necesidad alguna representación decimal, no el tipo de datos ++ double C.

Por supuesto, todo esto sólo es aplicable a double, por el título de la pregunta. El fragmento de código no utiliza realmente double.

Está ejecutando más allá de la frontera sin signo de 32 bits ... su número de 11 dígitos o más supera 0xFFFFFFFF, y así se envuelve alrededor.

Es necesario utilizar ya sea unsigned long long o double para la variable de number1:

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

Los grandes números imprimirá en notación científica de forma predeterminada cuando se le envía a std::cout si decide utilizar double como su tipo de datos, por lo que se quiere tirar un poco el formato en allí. Si utiliza un unsigned long long lugar, se imprimirán como se introdujeron, pero hay que estar seguros de que sus ayudas de la plataforma unsigned long long.

EDIT: Como han mencionado otros, el uso de los valores de punto flotante tiene otras implicaciones a considerar, y es muy probable que no lo que en última instancia, tratando de lograr. Que yo sepa, el tipo integral en una plataforma que produce el mayor valor positivo es unsigned long long, así que dependiendo de los valores que usted está buscando para trabajar, ver si eso es a su disposición para su uso.

Otros han señalado que los números de punto flotante son aproximaciones , por lo que realmente no se puede obtener una cifra exacta de dígitos en el mismo.

Pero ... se puede conseguir algo aproximado, tomando nota de ello a un objeto std :: stringstream, a continuación, convirtiéndolo en un std :: string, y conseguir la longitud de dicha cadena. Usted, por supuesto, tiene que lidiar con el hecho de que puede haber caracteres no-dígitos en la cadena (como signo menos, punto decimal, E para el exponente etc). También el número de dígitos que usted obtiene de esta manera sería dependiente opciones que elija al escribir en el objeto stringstream formateo. Pero suponiendo que usted sabe qué opciones que desea utilizar el formato, se puede obtener el número de sujetos dígitos a estas opciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top