2010-04-16 14 views
5

Acabo de leer que C99 tiene double_t que debe ser al menos tan ancho como el doble. ¿Esto implica que da más dígitos de precisión después del lugar decimal? Más de los 15 dígitos habituales para el doble ?.double_t en C99

En segundo lugar, cómo usarlo: está incluyendo solamente

#include <float.h> 

suficiente? Leí que uno tiene que configurar FLT_EVAL_METHOD en 2 por doble largo. ¿Como hacer esto? Como trabajo con métodos numéricos, me gustaría la máxima precisión sin utilizar una biblioteca de precisión arbitraria.

Muchas gracias ...

Respuesta

5

No. double_t es al menos tan ancho como doble; es decir, podría ser lo mismo que el doble. Nota al pie 190 en el estándar C99 hace que la clara intención:

Los tipos float_t y double_t se pretende que sean tipos más eficientes de la implementación al menos tan anchas como flotador y doble, respectivamente.

Como notó Michael Burr, no puede establecer FLT_EVAL_METHOD.

Si desea el tipo de punto flotante más amplio en cualquier sistema disponible solo con C99, use long double. Tenga en cuenta que en algunas plataformas será el mismo que double (e incluso podría ser el mismo que float).

Además, si "trabaja con métodos numéricos", debe tener en cuenta que para muchos (más parejos) métodos numéricos, el error de aproximación del método es mucho mayor que el error de redondeo de doble precisión, por lo que a menudo no beneficio de usar tipos más amplios. Existen excepciones, por supuesto. ¿En qué tipo de métodos numéricos estás trabajando, específicamente?

Editar: en serio, ya sea (a) sólo tiene que utilizar long double y lo llaman un día o (b) tomar algunas semanas para aprender acerca de cómo se llevan a la práctica de punto flotante en las plataformas de los que están orientados, y cuáles son los requisitos de precisión reales para los algoritmos que está implementando.

+0

Gracias. ¿El doble largo es más ancho que double_t? Esto estoy confundido. – yCalleecharan

+0

@yCalleecharan: En algunas plataformas, sí, en algunas plataformas, no. Por ejemplo, en OSX/Intel, 'double' y' double_t' son IEEE-754 double, mientras que 'long double' es x87 double extended type, que tiene más precisión. En una plataforma donde la aritmética de punto flotante se codifica a la unidad x87 por defecto (¿Windows, tal vez?), 'Double_t' podría ser lo mismo que' long double'. Es poco probable que 'double_t' sea * más amplio * que' long double' (aunque no imposible, IIRC). –

+0

En cuanto a los métodos numéricos que estoy usando, es simplemente un método de 4º orden de Runge Kutta para integrar un conjunto de ODE. Tuve que no dimensionar mis ecuaciones para obtener valores "agradables" ya que las ecuaciones no son lineales y la no linealidad puede conducir a fenómenos de caos. Estoy usando herramientas no lineales como un diagrama de bifurcación y un mapa de poincare. Como las soluciones de los ODE son delicadas, intento trabajar con la mayor precisión posible. – yCalleecharan

1

nota que que no se llega a establecer FLT_EVAL_METHOD - Está situado junto a las cabeceras del compilador para que pueda determinar cómo la biblioteca hace ciertas cosas con punto flotante.

Si su código es muy sensible a la forma exacta en que se realizan las operaciones de punto flotante, puede usar el valor de esa macro para compilar código condicionalmente para manejar las diferencias que podrían ser importantes para usted.

Así, por ejemplo, en general, usted sabe que double_t será, como mínimo, double en todos los casos. Si desea que su código haga algo diferente si double_t es long double, entonces su código puede probar si FLT_EVAL_METHOD == 2 y actuar en consecuencia.

Tenga en cuenta que si FLT_EVAL_METHOD es algo distinto de 0, 1 o 2, deberá consultar la documentación del compilador para saber exactamente qué tipo es double_t.

+0

Gracias. Entonces no logro establecer esta precisión. Pero aún así, ¿puedo simplemente definir una variable de tipo double_t simplemente incluyendo float.h? – yCalleecharan

+0

Para su segundo comentario, ¿podría darme un breve ejemplo para que entienda su implementación ... – yCalleecharan

+0

@yCalleecharan: sí, en cuyo caso debe obtener "los tipos más eficientes de la implementación al menos tan ... ". En otras palabras, algo posiblemente con más precisión que 'doble ', pero tal vez solo un viejo' doble' normal. –

0

double_t se pueden definir por typedef double double_t; - por supuesto, si va a confiar en los detalles de la implementación, necesita ver su propia implementación.

+0

Gracias por decirme cómo implementarlo. ¿Pero entonces necesito incluir float.h? – yCalleecharan

Cuestiones relacionadas