Jump to content
pedroluzio

Problema com Float

Recommended Posts

pedroluzio

Boas, estou a desenvolver um programa que conte o numero de casas decimanis de um numero, não quero a resposta, quero apenas que me expliquem pk é que a float mostra numero sei lá de onde:

#include <stdio.h>
#include <math.h>
main()
{

	 float n, n1, n2;
	 int i=0;

	 printf("Digite um numero: ");
	 scanf("%f",&n);

	 do
	 {
			 n1=n;
			 printf("%.5f\n",n1);
			 n1 = trunc(n1);



			 n2 = n - n1;

			 printf("%.5f\n",n2);

			 n= n2 * 10;

			 i++;
			 printf("%.5f\n",n);
			 printf("\n%d\n",i);

	 }while(n>0);

 getch();		

}

Share this post


Link to post
Share on other sites
HappyHippyHippo

primeiro, float é algo que não se usa ... não faz sentido usar ... hoje em dia, o uso de doubles chega a ser mais rápido que floats porque a ALU funcinoa sempre com doubles

segundo:

do {
// ...
n= n2 * 10;
// ...
}while(n>0);

quando é que o n toma valores negativos = nunca

terceiro, isso não se faz com floats ou doubles


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thoga31

Não gosto nada da tentativa de resolução que estás a fazer. Tanta variável, tanta conta... um ciclo com duas linhas, incluindo o próprio while, faz o truque.

Imagina o seguinte número: 12.3456. Como contas as 4 casas decimais? Sem qualquer trunc.

Vais multiplicando por 10 até chegares a 123456, e aqui páras. Mas como sabes se hás-de parar aqui? Porque 1234560 % 10 == 0.

Há várias formas de resolver o problema, mas essa é muito exotérica :D


Knowledge is free!

Share this post


Link to post
Share on other sites
Rui Carlos

A determinado ponto vais ter 0, mas ao usares valores numéricos, há uma forte probabilidade de teres erros de arredondamento, visto que o computador trabalha em base 2, e tu estás a fazer operações em base 10. E isto faz com que não obtenhas 0 tão rapidamente como devias. (Aliás, com os prints que tens no código, deves ter reparado que as operações nem sempre dão exactamente o resultado que esperas.)

Por isso, seria melhor usares strings para contar as casas decimais (que penso ser também o que o HappyHippyHippo estava a sugerir).

(HappyHippyHippo, na maior parte dos casos os doubles são melhores, mas também há alguns casos em que há vantagens em usar floats.)

EDIT: @thoga31, a tua solução também poderá ter problemas com os arredondamentos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.