Pregunta

¿Hay situaciones en las que tendría más sentido utilizar un solo tipo de datos en lugar de un doble? Desde mi búsqueda, la desventaja de un doble es que requiere más espacio, lo cual no es un problema para la mayoría de aplicaciones. En ese caso, deben todos los números de punto flotante ser dobles?

Un poco de información de fondo: Estoy trabajando con una aplicación que se ocupa de una gran cantidad de datos sobre las coordenadas y los productos químicos. Algunos clientes se han dado cuenta de que al importar hojas de cálculo de datos, algunos valores con alta precisión se redondean hacia abajo la precisión de una sola.

¿Fue útil?

Solución

En la mayoría de las aplicaciones de escritorio, sí.

A pesar de si usted tiene una enorme variedad de ellos, reducir a la mitad el tamaño de esa podría ser lo suficientemente importantes como para merecer la pena si usted no necesita la precisión.

Especialmente teniendo en cuenta que casi todos los escritorios de los consumidores tienen de doble precisión aritmética de punto flotante hecho en hardware.

Otros consejos

este artículo .net

  

Tipo de datos Ancho

     

Los tipos de datos son más eficientes   los que utilizan el ancho de datos nativo   de la plataforma en tiempo de ejecución. en actual   plataformas, la anchura de los datos es de 32 bits,   tanto para el ordenador y el   sistema operativo.

     

En consecuencia, Integer es actualmente la   la mayoría del tipo de datos eficiente en Visual   Basic .NET. Siguiente mejores son largos, cortos,   y Byte, en ese orden de eficiencia.   Puede mejorar el rendimiento de   Short y Byte apagando número entero   comprobación de desbordamiento, por ejemplo, por   el establecimiento de los RemoveIntegerChecks   propiedad, pero esto incurre en el riesgo de   cálculos incorrectos debido a   desbordamientos no detectados. No se puede   alternar este control de encendido y apagado durante   el tiempo de ejecución; sólo se puede establecer su valor   para la próxima compilación de su   aplicación.

     

Si necesita valores fraccionarios, las   mejor opción es doble, ya que la   Los procesadores de coma flotante de corriente   plataformas de ejecutar todas las operaciones   Precisión doble. Siguiente mejor son solo   y decimal, en ese orden de   eficiencia.

Como dice Marcos en su comentario, el espacio puede ser un problema en los sistemas con limitaciones de memoria. Usted también puede querer índice o ordenar una lista, y por qué hacer eso en dobles si se puede guardar sus valores en individuales?

En algunos tipos de hardware, la aritmética que implica valores dobles puede tardar más de lo que los valores individuales que implican, pero más reciente FPU tener un solo tipo de datos nativo (por ejemplo, 80 bits extendido valores de punto para x86 flotante) que se utilizan internamente para los cálculos independientemente de lo que los datos in-memory tipo que está utilizando. Por lo que quiere decir que "los cálculos FPU serán más rápidos con precisión simple" es generalmente no una razón para usar de precisión simple en la mayoría del hardware moderno de hoy.

Dicho esto, además de la "utiliza menos memoria" razones que se explican en las otras respuestas, hay una razón muy práctica cuando se trata de SIMD instrucciones vectoriales como SSE y AltiVec - precisión simple se vería debilitada dos veces más rápido como doble precisión, ya que las instrucciones operan sobre vectores de tamaño fijo, y se puede rellenar el doble de los valores de precisión simple en un solo vector, con el tiempo de procesamiento típicamente restante de la misma.

Por ejemplo, con una unidad de vector de 128 bits capaz de multiplicaciones de procesamiento de vectores en 2 ciclos de reloj, se puede obtener un rendimiento de 2 multiplicaciones de precisión simple por ciclo de reloj, frente a 1 doble precisión, ya que se puede 4 sencillas en un vector, frente a dos dobles.

Un efecto similar ocurre con el ancho de banda de memoria, y no es específico de procesamiento vectorial - si usted tiene grandes conjuntos de dobles, que no sólo se hará el doble de espacio, pero pueden tardar hasta el doble de tiempo para procesar en el caso de que su algoritmo está limitado ancho de banda (que está cada vez más probable dado los tamaños cada vez mayores y latencias decrecientes de unidades de procesamiento de vector).

Dobles tomar más espacio, pero la precisión adicional puede o no ser necesario. He hecho un montón de programación en el mundo científico, donde la aritmética de punto flotante es muy común y han encontrado que a menudo se puede hacer los cálculos en doble precisión o mayor pero almacenar los resultados como solteros y sin efectos nocivos.

Tenga en cuenta que una vez que los números son absorbidos en la FPU, que se expanden a una precisión muy alta de todos modos. Dicho esto, sería mejor intentar lo que está haciendo en los dos precisiones y ver si los resultados son comparables.

Por desgracia, la informática sigue siendo una ciencia experimental.

Si está OpenGL de codificación, entonces es normal utilizar GLSingle (por ejemplo individual) en lugar de GLDouble. En casi todas las circunstancias de precisión simple es más que suficiente para la mayoría de aplicaciones de gráficos y debe ser más rápido - aunque confieso que no estoy seguro de esto en la última generación de GPUs.

Mi cita favorita de esto es que la precisión simple era suficiente para navegar a la luna ida y vuelta, por lo que en la práctica es poco común que causa un problema real. Dicho esto, en la mayoría de circunstancias me alcanzo un doble hoy en día como el almacenamiento es barato y hay menos probabilidades de ser cualquier binario a decimal impar problemas.

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