[Ajuda] Pawn com problemas na divisгo?
#1

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(string128"%d %f"60/160/1);
    
SendClientMessage(playerid, -1string);
    return 
1;

Este cуdigo gera a mensagem:

Код:
60 0.000000
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?
Reply
#2

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)));
Reply
#3

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
Reply
#4

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)));
Reply
#5

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// 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.
Reply
#6

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)
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)