Cuidado com números em Ponto Flutuante
Quanto seria (200*0,7) + 200? 340 você diria? Então você deve ler este artigo. Dependendo da situação esta operação matemática não resultará em 340. Absurdo? Quem programa em linguagem de programação C deve ficar atento!
Pequeno programa em C
Para exemplificar este problema (bug?) compile e execute o seguinte programa em C:
Ao compilar e executar este código, misteriosamente a resposta 339 é impressa!
O mesmo não ocorre em outras linguagens, como PHP por exemplo, que imprime corretamente 340:
Ou, direto na linha de comando:
$ php -r '$a=200; $a = (int)($a*0.7); printf ("a=%d\n", $a);'
Sendo que usei (int) para garantir que a seja do tipo int, como no C, e usei o printf para ser como no C, igual.
Parece que estamos diante de um estranho bug de compilador C, que não existe no interpretador do PHP. Ou não?
Pois matematicamente esta operação resulta em 340 e não existe margem para demais interpretações, pois 0,7 multiplicado por 200 resulta em 140 e de forma exata, sem casas decimais. 140 somado a 200, por sua vez, resulta em 340.
#include <stdio.h>
int main()
{
int a;
a = 200;
a = (a * 0.7) + a;
printf("O valor de a eh %d\n", a);
}
int main()
{
int a;
a = 200;
a = (a * 0.7) + a;
printf("O valor de a eh %d\n", a);
}
Ao compilar e executar este código, misteriosamente a resposta 339 é impressa!
O mesmo não ocorre em outras linguagens, como PHP por exemplo, que imprime corretamente 340:
<?php
$a=200
$a = (int)($a*0.7);
printf ("a=%d\n", $a);
?>
$a=200
$a = (int)($a*0.7);
printf ("a=%d\n", $a);
?>
Ou, direto na linha de comando:
$ php -r '$a=200; $a = (int)($a*0.7); printf ("a=%d\n", $a);'
Sendo que usei (int) para garantir que a seja do tipo int, como no C, e usei o printf para ser como no C, igual.
Parece que estamos diante de um estranho bug de compilador C, que não existe no interpretador do PHP. Ou não?
Pois matematicamente esta operação resulta em 340 e não existe margem para demais interpretações, pois 0,7 multiplicado por 200 resulta em 140 e de forma exata, sem casas decimais. 140 somado a 200, por sua vez, resulta em 340.