Flotador y doble - ¿Cuál debo usar?

Anonim

(Nota: este artículo asume que los lectores conocen los conceptos básicos de la informática)

Muchos programadores / estudiantes novatos que están inscritos en Ciencias de la Computación hacen las preguntas frecuentes que son relevantes para el campo en particular dentro de la Ciencia de la Computación que estudian. La mayoría de los cursos para principiantes comienzan con los temas del sistema numérico que se utiliza en las computadoras modernas, incluido el binario , decimal , octal y hexadecimal sistema. Estos son los formatos de número de computadora que son las representaciones internas de valores numéricos en computadoras (o calculadoras y cualquier otro tipo de computadoras digitales). Estos valores se almacenan como “agrupación de bits”.

Como sabemos, las computadoras representan datos en conjuntos de dígitos binarios (es decir, en la combinación de 1s y 0s, como, 1111 representa 15 en el sistema decimal), tiene sentido enseñar sobre los diferentes formatos de números que se utilizan para representar un rango dinámico de valores, ya que forman los bloques básicos del procesamiento de cálculos / números en cualquier tipo de operación. Una vez que el sistema numérico se define en el aula (a menudo de forma deficiente), los estudiantes se ven tentados a pasar a los diferentes formatos numéricos dentro del mismo tipo (es decir, aritmética de punto flotante ) que tienen cierta precisión y rango de números. Así, se ven obligados a aprender los matices entre ciertos tipos. Dos de los tipos de datos más utilizados son Flotador y Doble , y mientras se dirigen a las mismas necesidades (es decir, aritmética de punto flotante ), hay una cierta diferencia en su representación interna y el efecto general en el cálculo en el programa. Es lamentable que muchos programadores no perciban los matices entre los tipos de datos Flat y Double, y terminen haciendo mal uso de ellos en lugares donde no deberían usarse en primer lugar. En última instancia, se producen errores de cálculo en otras partes del programa.

En este artículo, les voy a decir la diferencia entre flotar y duplicar con los ejemplos de código en lenguaje de programación C. ¡Empecemos!

Flotante contra doble … ¿Cuál es el trato?

Flotante y Doble son la representación de datos que se utilizan para las operaciones aritméticas de punto flotante, piense en los números decimales que calcula en la clase de matemáticas, como 20.123, 16.23, 10.2, etc., no son números enteros (es decir, 2, 5, 15, etc.), por lo que requieren la consideración de fracciones en el binario. Como los números decimales resultantes (es decir, 20.123, 16.23, etc.) no se puede representar fácilmente con un formato binario normal (es decir, Integer). La principal diferencia entre Float y Double es que el primero es el dato de punto flotante de precisión simple (32 bits), mientras que el segundo es el tipo de dato de punto flotante de precisión doble (64 bit). El doble se llama "doble" porque es básicamente una versión de doble precisión de Float. Si está calculando una gran cantidad (piense en los miles de 0 en el número), las inexactitudes serán más pequeñas en el doble y no perderá mucha precisión.

Es mejor elaborar utilizando los ejemplos de código. La siguiente es la operación en Float y Double a través de las funciones matemáticas proporcionadas en lenguaje C:

#incluir

int main () {

float num1 = 1.f / 82;

float num2 = 0;

para (int i = 0; i <738; ++ i)

num2 + = num1;

printf ("%. 7g n", num2);

doble num3 = 1.0 / 82;

doble num4 = 0;

para (int i = 0; i <738; ++ i)

num4 + = num3;

printf ("%. 15g n", num4);

getchar ();

}

Imprime lo siguiente:

9.000031

8.99999999999983

Aquí, puedes ver que la ligera diferencia en la precisión de Float y Double da una respuesta totalmente diferente, aunque Double parece ser más preciso que Float.

A continuación se muestra el ejemplo de la función sqrt () en C:

#incluir

#incluir

int main () {

float num1 = sqrt (2382719676512365.1230112312312312);

doble num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Da la siguiente salida:

48813108.000000

48813109.678778

Aquí, puedes ver que la respuesta en Doble tiene una mejor precisión.

En general, es mejor usar Double para la aritmética de punto flotante, ya que varias funciones matemáticas estándar en C operan en Double y las computadoras modernas son extremadamente rápidas y eficientes para los cálculos de punto flotante Double. Esto lleva a reducir la necesidad de usar Float, a menos que necesite operar en muchos números de punto flotante (piense en matrices grandes con miles de 0 en los números) o esté operando en un sistema que no admite doble punto flotante de precisión, ya que muchas GPU, dispositivos de baja potencia y ciertas plataformas (ARM Cortex-M2, Cortex-M4, etc.) no son compatibles con Double aún, entonces debe usar Float. Además, una cosa que debe recordar es que ciertas GPU / CPU funcionan mejor o son más eficientes en el procesamiento flotante, como en el cálculo de vectores / matriz, por lo que es posible que deba consultar el manual / documentación de especificaciones de hardware para decidir mejor cuál debe usar para una máquina en particular.

Rara vez hay una razón para usar Float en lugar de Double en el código dirigido a las computadoras modernas.La precisión adicional en Double reduce, pero no elimina, la posibilidad de errores de redondeo u otras imprecisiones que pueden causar problemas en otras partes del programa. Muchas funciones matemáticas u operadores convierten y devuelven el valor Doble, por lo que no es necesario volver a convertir los números en Flotante, ya que podría perder la precisión. Para un análisis detallado de la aritmética de punto flotante, te recomiendo que leas este impresionante artículo (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)

Resumen

Así que … en pocas palabras:

Lugares donde debes usar Flotador:

  • Si está apuntando al hardware donde la precisión simple es más rápida que la precisión doble.
  • Su aplicación hace un uso intensivo de la aritmética de punto flotante, como miles de números con miles de 0.
  • Estás haciendo una optimización de muy bajo nivel. Por ejemplo, está utilizando instrucciones de CPU especiales (es decir, SSE, SSE2, AVX, etc.) que operan en múltiples números / matrices / vectores a la vez.

Conclusión

En este artículo, he resaltado la diferencia entre Float y Double, y cuál se debe usar en lugares específicos. Podría decirse que es mejor usar Double en la mayoría de los lugares a ciegas, especialmente si está apuntando a computadoras modernas, ya que las posibilidades de baja eficiencia debido al uso de la aritmética de doble punto flotante son muy poco probables. Si tiene alguna pregunta, puede hacerla en la sección de comentarios a continuación.