Pregunta

flotante tipo de punto representa un número mediante el almacenamiento de sus dígitos significativos y su exponente por separado en palabras binarias separadas para que se ajuste en 16, 32, 64 o 128 bits.

punto fijo almacena tipo números con 2 palabras, uno que representa la parte entera, otro que representa la parte más allá de la radix, en exponentes negativos, 2 ^ -1, 2 ^ -2, 2 ^ -3, etc.

Float son mejores porque tienen una gama más amplia en un sentido exponente, pero no si se quiere almacenar el número con más precisión para un cierto rango, por ejemplo, sólo utilizando entero entre -16 y 16 años, por lo tanto con más bits a los dígitos de retención más allá de la raíz.

En cuanto a las actuaciones, que uno tiene el mejor rendimiento, o hay casos en los que algunos es más rápido que el otro?

En la programación de juegos de vídeo, hace que todo el mundo el uso de coma flotante debido a que la FPU hace que sea más rápido, o porque la caída de rendimiento es insignificante, o ellos hacen su propio tipo fijo?

Por qué no hay ningún tipo fijado en C / C ++?

¿Fue útil?

Solución

Esta definición abarca un subconjunto muy limitado de las implementaciones de punto fijo.

Sería más correcto decir que en el punto fijo solamente la mantisa se almacena y el exponente es una constante determinada a priori. No hay ningún requisito para el punto binario a caer dentro de la mantisa, y definitivamente no hay requisito de que caer en un límite de palabra. Por ejemplo, todos de los siguientes son "punto fijo":

  • 64 bits de mantisa, escalado por 2 -32 (esto se ajusta a la definición que aparece en la pregunta)
  • 64 bits de mantisa, escalado por 2 -33 (ahora los partes enteras y fraccionarias no pueden estar separados por una frontera de octeto)
  • 32 bits de mantisa, escalado por 2 4 (ahora no hay parte fraccionaria)
  • 32 bits de mantisa, escalado por 2 -40 (ahora no hay parte entera)

GPU tienden a utilizar punto fijo sin parte entera (típicamente mantisa de 32 bits escalada por 2 -32 ). APIs Por lo tanto, como OpenGL y Direct3D menudo utilizan tipos de punto flotante que son capaces de mantener estos valores. Sin embargo, la manipulación de la mantisa número entero es a menudo más eficiente por lo que estas API permiten especificar las coordenadas (en el espacio textura, espacio de color, etc) de esta manera también.

En cuanto a su afirmación de que C ++ no tiene un tipo de punto fijo, que no están de acuerdo. Todos los tipos de enteros en C ++ se fijan los tipos de puntos. El exponente es a menudo supone que es cero, pero esto no es necesario y tengo un poco de código DSP de punto fijo implementado en C ++ de esta manera.

Otros consejos

a nivel de código, aritmética de punto fijo es simplemente aritmética de enteros con un denominador implícita.

Para muchas operaciones aritméticas sencillas, operaciones de enteros de punto fijo y son esencialmente los mismos. Sin embargo, hay algunas operaciones que los valores intermedios deben ser representados con un mayor número de bits y luego redondeado. Por ejemplo, para multiplicar dos números de coma fija de 16 bits, el resultado debe ser almacenado temporalmente en 32 bits antes de renormalizar (o saturando) de nuevo a 16 bits de punto fijo.

Cuando el software no se aprovecha de vectorización (como SIMD basada en CPU o GPGPU), número entero y de punto fijo arithmeric es más rápido que FPU. Cuando se usa vectorización, la eficiencia de vectorización importa mucho más, de manera que las diferencias de rendimiento entre en coma fija y en coma flotante es discutible.

Algunas arquitecturas de hardware para proporcionar implementaciones ciertas funciones matemáticas, como sin, cos, atan, sqrt, para este tipo de punto flotante solamente. Algunas arquitecturas no proporcionan ninguna implementación de hardware en absoluto. En ambos casos, las bibliotecas de software de matemáticas especializados pueden proporcionar estas funciones mediante el uso de sólo números enteros o aritmética de punto fijo. A menudo, tales bibliotecas proporcionarán nivel múltiplo de precisiones, por ejemplo, respuestas que son sólo hasta una precisión de N-bits de precisión, que es menor que la precisión total de la representación. Las versiones precisión limitada pueden ser más rápido que la versión de más alta precisión.

punto fijo es ampliamente utilizado en DSP y sistemas embebidos donde a menudo el procesador objetivo no tiene FPU, y el punto fijo se puede implementar razonablemente eficiente usando un número entero ALU.

En términos de rendimiento, que es likley a variar dependiendo de la arquitectura de objetivo y la aplicación. Obviamente, si no hay una FPU, a continuación, el punto fijo será considerablemente más rápido. Cuando tiene una FPU que dependerá de la aplicación también. Por ejemplo realizar algunas funciones tales como sqrt (o) log () será mucho más rápido cuando está apoyado directamente en el conjunto de instrucciones en lugar thna implementarse algorítmicamente.

No hay una función de tipo de punto fijo en C o C ++ Imagino porque ellos (o por lo menos C) fueron concebidos como idiomas de nivel de sistemas y el punto de necesidad fijo es algo específico de dominio, y también tal vez porque en un propósito general procesador normalmente hay soporte de hardware no directa para el punto fijo.

En C ++ definir una clase de tipo de datos de punto fijo con sobrecargas de operadores adecuados y funciones matemáticas asociadas pueden superar fácilmente este shortcomming. Sin embargo, hay soluciones buenas y malas a este problema. Un bien ejemplo se puede encontrar aquí: http://www.drdobbs.com / CPP / 207000448 . El vínculo con el código en ese artículo se rompe, pero yo lo rastreó a ftp: / /66.77.27.238/sourcecode/ddj/2008/0804.zip

El diferrence entre operaciones aritméticas con enteros y de coma flotante depende de la CPU que tiene en mente. En los chips de Intel, la diferencia no es grande en clockticks. matemáticas int es aún más rápido porque hay múltiplo entero ALU es que el trabajo puede en paralelo. Los compiladores son también inteligente para utilizar instrucciones especiales de cálculo de dirección a optimizar la adición / multiplican en una sola instrucción. conteos de conversión como una operación demasiado, por lo que acaba de elegir su tipo y se pega con él.

En C ++ se puede construir su propio tipo de aritmética de punto fijo. Que acaba de definir como estructura con una intercepción y anular las sobrecargas apropiadas, y hacer que hagan lo que normalmente hacen más un turno de poner la parte de atrás de coma en la posición correcta.

hay que tener cuidado cuando se habla de "precisión" en este contexto.

Para el mismo número de bits en la representación del valor del punto fijo máximo tiene más bits significativos que cualquier valor de punto flotante (debido a que el formato de coma flotante tiene que dar algunos bits de distancia a exponente), pero el valor del punto fijo mínimo tiene menor que cualquier valor de punto flotante no desnormalizado (debido a que los residuos de valor de punto fijo la mayoría de su mantisa en ceros a la izquierda).

También en función de la forma en que se divide el número de punto fijo hacia arriba, el valor de punto flotante puede ser capaz de representar menor los números que significa que tiene una representación más precisa de "pequeña, pero no nula" .

Y así sucesivamente.

no lo utilizo de flotador en los juegos, ya que es más rápido o más lento que lo utilizan porque es más fácil de implementar los algoritmos de coma flotante que en punto fijo. Usted está asumiendo la razón tiene que ver con la velocidad de computación y que no es la razón, tiene que ver con la facilidad de programación.

Por ejemplo, puede definir la anchura de la pantalla / ventana gráfica como ir de 0,0 a 1,0, la altura de la pantalla de 0.0 a 1.0. La profundidad de la palabra 0,0 a 1,0. y así. Matriz de matemáticas, etc hace las cosas muy fácil de implementar. Hacer todas las matemáticas de esa manera hasta el punto en que necesita para calcular píxeles reales en un tamaño real de la pantalla, por ejemplo 800x400. Proyectar el rayo desde el ojo hasta el punto en el objeto en el mundo y de cálculo donde se perfora la pantalla, usando 0 a 1 matemáticas, luego multiplicar x por 800, y veces 400 y lugar que pixel.

punto flotante no almacenar el exponente y mantisa por separado y la mantisa es un número torpe, lo que queda después de que el exponente y muestra, como 23 bits, no 16 o 32 o 64 bits.

aritmética de punto flotante en sus usos núcleo fijo lógica con la lógica punto extra y requiere pasos adicionales. Por definición las manzanas en comparación con manzanas punto fijo de matemáticas es más barato, ya que no tiene que manipular los datos sobre la forma en la ALU y no tiene que manipular los datos en la salida (normalizar). Cuando se agrega en IEEE y toda su basura que añade aún más lógica, más ciclos de reloj, etc (debidamente firmado infinito, tranquilo y panes Nan de señalización, resultados diferentes para misma operación si hay un controlador de excepciones habilitado). Como alguien señaló en un comentario en un sistema real donde se puede hacer fijo y flotante en paralelo, se puede tomar ventaja de algunos o todos los procesadores y recuperar algunos relojes de esa manera. ambos con flotador y velocidad de reloj fijo se puede aumentar mediante el uso de grandes cantidades de chip de bienes raíces, fija permanecerá más barato, pero flotador puede acercarse a velocidades fijas utilizando este tipo de trucos, así como el funcionamiento en paralelo.

Una cuestión no prevista es las respuestas es un consumo de energía. A pesar de que es altamente dependiente de la arquitectura hardware específico, por lo general FPU consume mucha más energía de la ALU en la CPU por lo tanto si la orientación de las aplicaciones móviles, donde el consumo de energía es importante que vale la pena considerar impelementation punto fijo del algoritmo.

Depende de lo que está trabajando. Si estás usando punto fijo entonces se pierde precisión; usted tiene que seleccionar el número de plazas tras el punto decimal (que no siempre puede ser lo suficientemente bueno). En coma flotante que no es necesario preocuparse por esto que la precisión que ofrece casi siempre es lo suficientemente bueno para la tarea en cuestión - utiliza una aplicación formulario estándar para representar el número

.

Los pros y los contras se reducen a la velocidad y recursos. En las plataformas de 32 y 64 bits modernos realmente no hay necesidad de utilizar el punto fijo. La mayoría de los sistemas vienen con construido en las FPU que están cableados para ser optimizado para operaciones de punto fijo. Por otra parte, la mayoría de las características intrínsecas de la CPU modernos vienen con operaciones tales como el conjunto SIMD, que a través de los métodos basados ??en la vectorización y desenrollar vector de optimizar la ayuda. Así que el punto fijo sólo viene con un aspecto negativo.

En los sistemas embebidos y microcontroladores pequeños (de 8 bits y 16 bits) puede que no tenga una FPU ni conjuntos de instrucciones extendidas. En cuyo caso se verá forzado a usar métodos de punto fijo o los conjuntos de instrucciones de coma flotante limitados que no son muy rápido. Por lo tanto, en estas circunstancias punto fijo será una mejor - o incluso su única -. Elección

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