Pawn com problemas na divisгo? -
Juniiro3 - 23.07.2015
O cуdigo abaixo por algum motivo nгo й executado corretamente (problemas com ponto flutuante, talvez?):
PHP код:
#include "a_samp"
#include "zcmd"
COMMAND:testar(playerid)
{
new
string[128];
format(string, 128, "%d %f", 60/1, 60/1);
SendClientMessage(playerid, -1, string);
return 1;
}
Este cуdigo gera a mensagem:
Note que quando usado %d a divisгo gera 60, porйm quando usado %f retorna 0.000000.
Alguma ideia do que pode estar acontecendo?
Re: Pawn com problemas na divisгo? -
n0minal - 23.07.2015
O especificador "%f" deve ser usado apenas pra valores flutuantes, no caso seria algo do tipo:
Код:
format(string, 128, "%d %f" 60/1, floatdiv(float(60), float(1)));
Re: Pawn com problemas na divisгo? -
Juniiro3 - 23.07.2015
Quote:
Originally Posted by ipsLeon
O especificador "%f" deve ser usado apenas pra valores flutuantes, no caso seria algo do tipo:
Код:
format(string, 128, "%d %f" 60/1, floatdiv(float(60), float(1)));
|
Eu fiz outros testes, e mesmo quando a divisгo retorna um float (ex: 60/50) o valor й 0.000000
Re: Pawn com problemas na divisгo? -
n0minal - 24.07.2015
Quote:
Originally Posted by Juniiro3
Eu fiz outros testes, e mesmo quando a divisгo retorna um float (ex: 60/50) o valor й 0.000000
|
Como eu disse anteriormente, vocк tб tentando colocar uma divisгo de dois inteiros como um float direto no format, isso nгo й suportado, pra vocк dividir dois nъmeros e jogб-los num format vocк precisa tratar eles como float, deferindo assim os valores 60.0/50.0 vocк percebe que vai retornar 1.20000, nгo se pode fazer a conversгo direta de um inteiro pra float, pra isso usa-se a funзгo
float.
Exemplos:
Код:
//Divisгo de floats jб definidos como tipo float:
printf("Float: %f", 60.0/50.0);
Код:
//Conversгo de inteiros para float e divisгo pelo operador comum "/" ou "%":
printf("Float: %f", float(60)/float(50));
Код:
//Utilizando as funзхes destinadas nativamente а floats:
new var1 = 60, var2 = 50;
printf("Float: %f", floatdiv(float(var1), float(var2)));
Re: Pawn com problemas na divisгo? -
Dolby - 24.07.2015
Esse й daquele tipo de tуpico que gosto de fazer uma daquelas fodendo explicaзхes, entгo vamos lб.
Vou usar como exemplo, uma possнvel "falha" do PHP que geralmente os que realmente nгo entendem o processo de tipagem de dados dinвmica dela costumam criticar, sendo que na verdade isso й uma falha dos mesmos.
Em PHP, se vocк
comparar qualquer string com 0, o valor de retorno vai ser verdadeiro.
PHP код:
if("string" == 0) // O valor dessa condicional sempre serб verdadeiro
Isso entгo й uma falha da linguagem? Nгo necessariamente.
PHP й dinamicamente tipado, ou seja, vocк pode fazer este tipo de coisa:
PHP код:
$oi = "Teste";
$oi = 1450;
Que o prуprio interpretador faz um type casting implнcito, a fim de transformar a variбvel em um dado inteiro.
Ok. E daн?
E daн, que quando vocк faz aquela comparaзгo de qualquer string com 0, o interpretador faz primeiro um type casting de string para inteiro antes de tudo, para depois uma possнvel atribuiзгo. E qual a melhor forma do interpretador fazer isto? Qual valor ele deve pre-inicializar para essa nova variбvel inteira? O valor 0.
Resumidamente, й basicamente assim:
PHP код:
if("Dolby" == 0) //Primeiramente o interpretador precisa converter os dados para tipos inteiros
if(0 == 0) // E como citei, se vocк converter *QUALQUER* string para inteiro, ela assume o valor 0(start point, digamos assim).
*: Caso a string comece por um inteiro, algo como
2Dolby, seu valor do casting implicito para inteiro, seja 2.
Faзa o
teste:
PHP код:
if("Dolby" == 0) echo "Dolby Verdadeiro";
if("2Dolby" == 0) echo "2Dolby Verdadeiro"; // Essa condicional serб falsa
Exatamente por este motivo que o PHP tem um operador que leva em consideraзгo, o tipo de dado, chamado de strict equals ( === ). Sim, sгo 3 iguais.
PHP код:
if('1' == 1) //Verdadeiro
if('1' === 1) //Falso
O que aconteceu no seu cуdigo foi exatamente isto. Vocк dividiu
60 por 1, que resultou em
60, no entanto, como utilizou o placeholder
%f, vocк obrigou o compilador a fazer um type casting implнcito de
inteiro para
float , que como foi citado acima, assume o "start point", valor 0.
E como burlar isto? Trate os valores, como floats, assim como foi citado pelo
Leonardo.
PHP код:
printf("Float: %f", float(60)/float(50));
Espero que tenha sido ъtil.
Abraзos.
Re: Pawn com problemas na divisгo? -
Kimossab - 24.07.2015
versгo tl;dr (too long didn't read / demasiado grande nгo li):
A divisгo entre dois inteiros retorna sempre um inteiro (porque faz sempre a divisгo inteira ou seja como se fosse a mгo). Para retornar um float pelo menos um dos numeros da divisгo tem que ser um float.
Nгo podes colocar inteiros num placeholder %f.
Resumindo tens que fazer um cast e tornar inteiro em float.
(ya eu nao tenho mais nada pa fazer)