ADA - Tipos float

 
Vista:

Tipos float

Publicado por Martinez (1 intervención) el 20/01/2006 22:56:31
Hola buenas, soy novato en ada, alguien sabe porqué al poner esta instrucción:

put ( float(float(0.99999887777) / float(10.0)), 10,2,0);

me imprime 0.10 en vez de 0.99

no entiendo porqué hace estos redondeos con tipos float, ¿alguien sabe hasta cuantos decimales de precisión tiene un tipo float?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Problemas de precisión en operaciones con tipos float

Publicado por Alejandro (155 intervenciones) el 30/06/2023 16:31:10
El problema que estás experimentando se debe a la precisión limitada de los números de punto flotante (float) en Ada y en otros lenguajes de programación. Los números de punto flotante utilizan una representación binaria que no puede representar exactamente todos los números racionales.

En el caso específico de tu ejemplo, el número 0.99999887777 no puede ser representado exactamente como un número de punto flotante. Durante la división y la conversión de tipos, se producen redondeos y aproximaciones que afectan el resultado final.

Para controlar la precisión de los números de punto flotante en Ada, puedes utilizar el paquete "Ada.Text_IO.Float_IO" que proporciona funciones para el formateo de números en coma flotante.

Aquí tienes un ejemplo de cómo modificar tu código utilizando "Ada.Text_IO.Float_IO" para obtener el resultado deseado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
with Ada.Text_IO;
with Ada.Text_IO.Float_IO;
 
procedure Main is
begin
   Ada.Text_IO.Float_IO.Put(
      Item     => Float(0.99999887777) / Float(10.0),
      Fore     => 10,
      Aft      => 2,
      Exp      => 0,
      Width    => 0,
      Sign     => Ada.Text_IO.Float_IO.Plus,
      Base     => 10);
end Main;

En este ejemplo, se utiliza la función "Put" del paquete "Ada.Text_IO.Float_IO" para imprimir el resultado con la precisión y el formato deseado. Los parámetros "Fore" y "Aft" especifican la cantidad de dígitos antes y después del punto decimal, respectivamente. Con estos ajustes, se debería imprimir el valor "0.99" en lugar de "0.10".

Es importante tener en cuenta que la precisión de los números de punto flotante puede variar dependiendo de la implementación del compilador y de la arquitectura de la máquina. Los números de punto flotante son aproximados y es común que existan pequeñas discrepancias en los cálculos.

Si necesitas una precisión más exacta en tus cálculos, puedes considerar el uso de tipos de datos de punto fijo o de precisión arbitraria proporcionados por paquetes adicionales en Ada, como el paquete "Ada.Numerics.Float_Random" o el paquete "Ada.Text_IO.Fixed_IO".

Recuerda ajustar el código según tus necesidades específicas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar