¿Por qué el PIC18 no puede realizar una operación de división con precisión?

1

Acabo de notar que cuando estoy convirtiendo las coordenadas del formato N / S E / W al formato decimal, se está obteniendo un producto incorrecto. Probé 1256/3600 que debería ser 0.3488888888889 pero mi foto me da 0.3488922 y 7/60 que debería ser 0.11666666666 y la foto me da 0.116666794. Al agregar esos productos y el número 23 obtengo 23.46582 pero debería ser 23.4655555556. Como estoy construyendo un laptimer no quiero tanto error. Según enlace necesito una precisión de 0.00001 que es de 1.11 metros. Podría tolarar un poco más pero no mucho más. Podría adivinar que esto se debe al procesador, pero realmente creo que debería ser una forma de evitarlo.

La fórmula que estoy usando es: x + y / 60 + z / 3600 donde x, y, z son números enteros.

    
pregunta user1842278

3 respuestas

4

Algunos compiladores para el PIC tienen la opción de seleccionar un formato de punto flotante de 24 bits o de 32 bits. No especificas tu compilador o su configuración, pero supongo que estás configurado para usar cálculos menos precisos. Tenga en cuenta, BTW, que la división de punto flotante puede ser mucho más lenta que la multiplicación. El cálculo previo de los valores de 1 / 60.0 y 1 / 3600.0 y la multiplicación por ellos es probable que sea mucho más rápido que dividir por 60.0 o 3600.0.

    
respondido por el supercat
1

Debido a los formatos de punto flotante, los números no son exactos. Si necesita esa precisión, use matemática de punto fijo.

Lo que todo científico informático debe saber sobre las matemáticas de punto flotante. por David Goldberg, 1991

    
respondido por el Matt M
1

Depende de tu compilador. Uno de sus números (1256/3600) parece calcularse con una precisión de 5 dígitos (aproximadamente 16 bits) y el otro (7/60) con una precisión de aproximadamente 24 bits, lo que implica matemáticas mixtas de 24 y 32 bits (con un byte utilizado para el exponente).

El uso de la matemática de punto flotante de 32 bits debería ser lo suficientemente bueno para ti (tal vez llamado dobles con tu compilador). Algunos compiladores tienen dobles de 64 bits, lo que es más que suficiente (pero más lento).

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas