2010-08-28 9 views
12

Duplicar posible:
Why doesn't C have unsigned floats?¿Por qué no hay tipos de punto flotante sin signo?

La pregunta es, probablemente, muy básico y probablemente respondió muchas veces antes, pero quiero entender por qué C++ no tiene tipos de coma flotante sin firmar, aunque los literales de punto flotante se pueden firmar o no.

$ 3.9.1/8- "Hay tres tipos de punto flotante : float, double y largo doble."

+0

@Greg Hewgill: Sí, cambió el amigo del título. – Chubsdad

+0

@Greg Hewgill: actualizado según sus comentarios. – Chubsdad

+0

Los literales de punto flotante siempre se firman en términos de * tipo *. Si prefijos explícitamente con +/- no cambia eso y el sufijo con U o LU como lo harías con un literal entero para forzar el tipo es un error. – Clifford

Respuesta

22

tipos entero sin signo tienen dos propiedades importantes que los diferencian de los tipos de enteros con signo: "desplazado" rango (sin subrango negativo, pero positivo subrango el doble de ancho) y la aritmética de módulo. Para tipos enteros, estas propiedades son lo suficientemente importantes como para justificar la existencia de tipos sin firmar.

Con los tipos flotantes, ninguna de estas propiedades es inmediatamente aplicable. Con los tipos de punto flotante, el problema principal no está en su rango (para muchos propósitos se puede pensar que es prácticamente infinito), sino más bien en precisión. Y la aritmética de módulo no es naturalmente aplicable a tipos no enteros. Por esta razón, no tenía mucho sentido introducir tipos de punto flotante sin signo, es decir, no tenía mucho sentido cambiar el papel de solo un bit en la representación de coma flotante.

También se debe tener en cuenta que el razonamiento anterior probablemente se debe usar como argumento detrás de la introducción de tipos enteros sin firmar (y no introducir tipos de punto flotante sin signo) en hardware popular y los correspondientes estándares derivados de hardware. Lo que tenemos en C y C++ fue esencialmente heredado de las capacidades de hardware y estos estándares.

Por supuesto, desde el punto de vista conceptual if view, sería bastante lógico tener tipos de punto flotante sin firmar en el idioma, solo por el bien de la coherencia. Pero, por desgracia, no están allí.

+0

Aceptando esta respuesta para la última declaración: "Por supuesto, desde el punto de vista conceptual si es posible, sería bastante lógico tener tipos de punto flotante sin firmar en el idioma, solo por el bien de la coherencia. Pero, por desgracia, no están allí ". También el razonamiento sobre "lo suficientemente importante como para justificar la existencia" parece correcto, aunque no soy un experto en C++ – Chubsdad

+0

Vale la pena observar que el comportamiento de restar un valor sin signo más grande de uno más pequeño está bien definido, pero hay no hay un significado claro para restar un flotante más grande de uno más pequeño, que no sea informar un resultado negativo. – supercat

6

Todos los puntos flotantes están firmados. C++ sigue el estándar IEEE 754, que es la implementación de hardware más común y lo sigue, los flotantes siempre se firman.

Como los flotadores ya ocupan al menos 32 bits, la ganancia de tener una implementación de software que recuperaría ese 1 bit es insignificante en comparación con la utilidad de dicha implementación.

+1

Omitiré "por defecto", ya que no hay ninguna alternativa. –

+0

Básicamente estaba buscando una manera de evitar que una variable de tipo double/float adopte un valor negativo, diciendo algo como 'double sin signo' – Chubsdad

+0

@Greg, corregido. –

Cuestiones relacionadas