Informacion

C ++ Manejo de flotantes y flotadores

C ++ Manejo de flotantes y flotadores

01 de 08

Todo sobre los números en C ++

En C ++ hay dos tipos de números. Ints y flotadores. También hay variantes de estos tipos que contienen números más grandes, o solo números sin signo, pero todavía son ints o flotantes.

Un int es un número entero como 47 sin un punto decimal. No puede tener 4.5 bebés o bucle 32.9 veces. Puede tener $ 25.76 si usa un flotador. Entonces, cuando cree su programa, debe decidir qué tipo usar.

¿Por qué no solo usar flotadores?

¿Esto es lo que hacen algunos lenguajes de script? Debido a que es ineficiente, los flotadores ocupan más memoria y generalmente son más lentos que los ints. Además, no puede comparar fácilmente dos flotadores para ver si son iguales como lo hace con las entradas.

Para manipular números, debe almacenarlos en la memoria. Debido a que el valor se puede cambiar fácilmente, se llama variable.

  • Lea más sobre las variables en ¿Qué es una variable?

El compilador que lee su programa y lo convierte en código de máquina necesita saber de qué tipo es, es decir, si es int o flotante, por lo que antes de que su programa use una variable, debe declararlo.

Aquí hay un ejemplo.

int Counter = 0; flotador BasicSalary;

Notará que la variable Contador está establecida en 0. Esta es una inicialización opcional. Es una muy buena práctica inicializar variables. Si no inicializa y luego los usa en el código sin haber establecido un valor inicial, la variable comenzará con un valor aleatorio que puede 'romper' su código. El valor será lo que haya en la memoria cuando se cargó el programa.

02 de 08

Más acerca de Ints

¿Cuál es el número más grande que puede almacenar un int?. Bueno, depende del tipo de CPU, pero generalmente se acepta como 32 bits. Debido a que puede contener casi tantos valores negativos como positivos, el rango de valores es +/- 2-32 a 232 o -2,147,483,648 a +2,147,483,647.

Esto es para un int con signo, pero también hay un int sin signo que tiene cero o positivo. Tiene un rango de 0 a 4,294,967,295. Solo recuerda - los ints sin signo no necesitan un signo (como + o -1) delante de ellos porque siempre son positivos o 0.

Ints cortos

Hay un tipo int más corto, casualmente llamado short int que usa 16 bits (2 bytes). Esto contiene números en el rango de -32768 a +32767. Si usa una gran cantidad de entradas, posiblemente pueda ahorrar memoria usando entradas cortas. No será más rápido, a pesar de ser la mitad del tamaño. Las CPU de 32 bits obtienen valores de la memoria en bloques de 4 bytes a la vez. Es decir. 32 bits (de ahí el nombre: ¡CPU de 32 bits!). Por lo tanto, obtener 16 bits aún requiere una recuperación de 32 bits.

Hay un 64 bit más largo llamado largo largo en C. Algunos compiladores de C ++, aunque no admiten ese tipo, usan directamente un nombre alternativo, p. tanto Borland como Microsoft usan _int64. Esto tiene un rango de -9223372036854775807 a 9223372036854775807 (firmado) y de 0 a 18446744073709551615 (sin firmar).

Al igual que con ints hay un unsigned short int tipo que tiene un rango de 0 ... 65535.

Nota: Algunos lenguajes de computadora se refieren a 16 bits como Palabra.

03 de 08

Aritmética de precisión

Doble problema

No hay flotación larga, pero hay un tipo doble que es dos veces más grande que la flotación.

  • Flotador: Ocupa 4 bytes. Alcance 17x10-38 a 1.7x1038
  • Doble: Ocupa 8 bytes. Rango 3.4x10-308 a 3.4308

A menos que esté haciendo programación científica con números muy grandes o pequeños, solo usará dobles para una mayor precisión. Los flotadores son buenos para 6 dígitos de precisión, pero los dobles ofrecen 15.

Precisión

Considere el número 567.8976523. Es un valor flotante válido. Pero si lo imprimimos con este código a continuación, puede ver la falta de precisión que aparece. El número tiene 10 dígitos, pero se almacena en una variable flotante con solo seis dígitos de precisión.

#include usando el espacio de nombres estándar; int main (int argc, char * argv) {valor flotante = 567.8976523; cout.precision (8); cout << valor << endl; devuelve 0; }

Consulte Acerca de la entrada y la salida para obtener detalles sobre cómo funciona cout y cómo usar la precisión. Este ejemplo establece la precisión de salida a 8 dígitos. Lamentablemente, los flotantes solo pueden contener 6 y algunos compiladores emitirán una advertencia sobre la conversión de un doble en un flotante. Cuando se ejecuta, esto se imprime 567.89764

Si cambia la precisión a 15, se imprime como 567.897644042969. Toda una diferencia! Ahora mueva el punto decimal dos a la izquierda para que el valor sea 5.678976523 y vuelva a ejecutar el programa. Esta vez genera 5.67897653579712. Esto es más preciso pero aún diferente.

Si cambia el tipo de valor a doble y la precisión a 10, imprimirá el valor exactamente como se define. Como regla general, los flotantes son útiles para números pequeños no enteros, pero con más de 6 dígitos, debe usar dobles.

04 de 08

Aprenda sobre operaciones aritméticas

Escribir software de computadora no sería muy útil si no pudieras sumar, restar, etc. Aquí tienes el ejemplo 2.

// ex2numbers.cpp // #include using namespace std; int main () {int a = 9; int b = 12; int total = a + b; cout << "El total es" << total << endl; devuelve 0; }

Explicación del ejemplo 2

Se declaran tres variables int. A y B son valores asignados, luego al total se le asigna la suma de A y B.

Antes de ejecutar este ejemplo

Aquí hay un pequeño consejo para ahorrar tiempo al ejecutar aplicaciones de línea de comandos.

Cuando ejecuta este programa desde la línea de comandos, debería generar "El número es 22".

Otras operaciones aritméticas

Además de la suma, puedes hacer resta, multiplicación y división. Simplemente use + para la suma, - para la resta, * para la multiplicación y / para la división.

Intente cambiar el programa anterior: use la resta o la multiplicación. También puede cambiar entradas a flotadores o dobles.

Con los flotantes, no tiene control sobre cuántos puntos decimales se muestran a menos que establezca la precisión como se muestra anteriormente.

05 de 08

Especificación de formatos de salida con cout

Cuando está generando números, debe pensar en estos atributos de los números.

  • Ancho: cuánto espacio se necesita para el número completo
  • Alineación - izquierda o derecha - los números tienden a estar alineados a la derecha
  • Numero de decimales
  • Signo o corchetes para números negativos.
  • Miles de separadores. Grandes números se ven feos sin estos.

Ahora el ancho, la alineación, el número de decimales y los signos se pueden establecer cout objeto y iomanip Incluye funciones de archivo.

Miles de separadores son un poco más complicados. Se configuran desde la configuración regional de una PC. Una configuración regional contiene información relevante para su país, como símbolos de moneda y punto decimal y separadores de miles. En el Reino Unido y Estados Unidos, el número 100.98 usa un punto decimal. como punto decimal, mientras que en algunos países europeos es una coma, por lo que € 5,70 significa un precio de 5 euros y 70 centavos.

int main () {double a = 925678.8750; cout.setf (ios_base :: showpoint | ios_base :: right); cout.fill ('='); cout.width (20); locale loc (""); cout.imbue (loc); cout.precision (12); cout << "El valor es" << a << endl; //cout.unsetf(ios_base::showpoint); cout << left << "El valor es" << a << endl; para (int i = 5; i <12; i ++) {cout.precision (i); cout << setprecision (i) << "A =" << a << endl; } const moneypunct & mpunct = use_facet (loc); cout << loc.name () << mpunct.thousands_sep () << endl; devuelve 0; }

El resultado de esto es

======= El valor es 925,678.875000 El valor es 925,678.875000 A = 9.2568e + 005 A = 925,679. A = 925,678.9 A = 925,678.88 A = 925,678.875 A = 925,678.8750 A = 925,678.87500 Inglés_Reino Unido.1252,06 de 08

Sobre Locale y Moneypunct

El ejemplo usaba un objeto local de la PC en la línea

locale loc ("");

La línea

const moneypunct & mpunct = use_facet (loc);

crea un objeto mpunct que es una referencia a un moneypunct clase de plantilla Esto tiene información sobre el entorno local especificado; en nuestro caso, el miles_sep () El método devuelve el carácter utilizado para el separador de miles.

Sin la linea

cout.imbue (loc);

No habría separadores de miles. Intenta comentarlo y volver a ejecutar el programa.

Nota Parece haber discrepancias entre los diferentes compiladores sobre cómo cout.imbue se comporta En Visual C ++ 2005 Express Edition, esto incluía separadores. ¡Pero el mismo código con Microsoft Visual C ++ 6.0 no lo hizo!

Puntos decimales

El ejemplo en la página anterior usado punto de vista para mostrar ceros finales después de los puntos decimales. Produce números en lo que se llama modo estándar. Otros modos incluyen

  • Modo fijo: muestra números como 567.8
  • Modo científico: muestra números como 1.23450e + 009

Si utiliza cualquiera de estos dos modos de formato a través de cout.setf luego precisión() establece el número de lugares decimales después del punto decimal (no el número total de dígitos) pero pierde el formato de miles. También ceros finales (como fueron habilitados por ios_base :: showpoint ) se habilita automáticamente sin necesidad punto de vista.

07 de 08

Cosas a tener en cuenta con ints, flotadores y bools

Echa un vistazo a esta declaración.

flotador f = 122/11;

Esperarías algo así como un valor de 11.0909090909. De hecho, el valor es 11. ¿Por qué es esto? porque la expresión en el lado derecho (conocido como rvalue) es entero / entero. Por lo tanto, utiliza la aritmética de enteros que arroja la parte fraccional y asigna 11 a f. Cambiándolo a

flotador f = 122.0 / 11

lo corregirá Es una trampa muy fácil.

Tipos Bool e Int

En C, no existe el tipo de bool. Las expresiones en C se basaron en que un cero es falso o un no cero es verdadero. En C ++ el tipo bool puede tomar los valores cierto o falso. Estos valores siguen siendo equivalentes a 0 y 1. En algún lugar del compilador tendrá un

const int falso = 0; const int true = 1;

¡O al menos actúa de esa manera! Las dos líneas siguientes son válidas sin conversión, por lo que detrás de escena, los bools se convierten implícitamente en ints e incluso se pueden aumentar o disminuir, aunque esta es una práctica muy mala.

bool fred = 0; int v = verdadero;

Mira este código

bool bad = true; mal ++ if (mal) ...

El if todavía hará el if ya que la variable incorrecta no es cero, pero es un código incorrecto y debe evitarse. Una buena práctica es usarlos como están destinados. si (! v) es válido en C ++ pero prefiero el más explícito si (v! = 0). Eso, sin embargo, es una cuestión de gustos, no una debe hacer directiva.

08 de 08

Use enumeraciones para un mejor código

Para una mirada más profunda a las enumeraciones, lea primero este artículo.

Un enumeración type proporciona una forma de restringir una variable a uno de un conjunto fijo de valores.

enum rainbowcolor {rojo, naranja, verde, amarillo, azul, índigo, violeta};

enum rainbowcolor {rojo = 1000, naranja = 1005, verde = 1009, amarillo = 1010, azul, índigo, violeta};amarillo = 1010

Puede asignar un valor de enumeración a un int como en

int p = rojo;

Rainbowcolor g = 1000; // ¡Error!

rainbowcolor g = rojo;tipo de seguridades mejor para el compilador detectar errores en tiempo de compilación que el usuario en tiempo de ejecución

A pesar de que las dos declaraciones son conceptualmente iguales. De hecho, generalmente encontrarás que estas dos líneas aparentemente idénticas

int p = 1000; rainbowcolor r = rojo;

Eso completa este tutorial. El siguiente tutorial es sobre expresiones y declaraciones.