Dúvidas matemáticas (muitos zeros no resultado)

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Tilo
Posts: 8
Joined: 17 Feb 2021, 02:56

Dúvidas matemáticas (muitos zeros no resultado)

Post by Tilo » 27 May 2021, 21:03

Olá,

Ainda tentanto aprender o básico sobre o AutoHotkey, tentei criar um script pra fazer contas simples. Usando um número variável a ser inserido através do InputBox. Ficando assim:

Code: Select all

InputBox, num, , , , 180, 100, , , , ,
Var1 := num / 2 * 3
Var2 := num / 3 * 2

MsgBox %Var1% / %Var2%
Coloquemos como exemplo, 222 como sendo o número variável. O resultado apresentado é assim:
333.000000 / 148.000000
. Ok, não está errado. Mas porque aparece esse monte de zeros e como fazer com que eles não apareçam numa próxima tentativa com scripts para fazer contas/equações/resolver_coisas_matemáticas?

garry
Posts: 3758
Joined: 22 Dec 2013, 12:50

Re: Dúvidas matemáticas (muitos zeros no resultado)

Post by garry » 28 May 2021, 07:28

Exemplo-1

Code: Select all

InputBox, num, , , , 180, 100, , , , ,
Var1 := (num // 2) * 3
Var2 := (num // 3) * 2

MsgBox %Var1% `n %Var2%  ; 333 and 148
exitapp
veja também > SetFormat, float, 0.2 or //

Exemplo-2

Code: Select all

#warn
#NoEnv
#SingleInstance force
filename1=MATHE-GUI-TEST
SetWorkingDir, %A_ScriptDir%
Gui,2:default
Gui,2: -DPIScale
;Gui,2:Font,s14 , Lucida Console
Gui,2:Font,s14 cYellow, Verdana
Gui,2:Color,Black
SetFormat, float, 0.2
wa:=A_screenwidth,ha:=A_screenHeight,xx:=100
var1:=222
;------
x:=(wa*1)/xx,y:=(ha*2)/xx
Gui,2: Add, Text    , x%x%  y%y%  , Variable-1=
;------
x:=(wa*8)/xx,y:=(ha*2)/xx,h:=(ha*2.4)/xx,w:=(wa*10)/xx
Gui,2: Add, Edit    , x%x% y%y%  w%w%  h%h%   vC1 right cBlack         ,%var1%       ;
;------
x:=(wa*1)/xx,y:=(ha*6)/xx
Gui,2: Add, Text    , x%x%  y%y%  , Result    =
;------
x:=(wa*8)/xx,y:=(ha*6)/xx,h:=(ha*2.4)/xx,w:=(wa*10)/xx
Gui,2: Add, Edit    , x%x% y%y%  w%w%  h%h%  vC2 right readonly,                   ;
;------
x:=(wa*1)/xx,y:=(ha*10)/xx,h:=(ha*2.5)/xx,w:=(wa*7)/xx
Gui,2: Add, Button  , x%x% y%y%  w%w%  h%h%  gA1 center,CALCULATE
;------
x:=(wa*10)/xx,y:=(ha*10)/xx,h:=(ha*2.5)/xx,w:=(wa*7)/xx
Gui,2: Add, Button  , x%x% y%y%  w%w%  h%h%  gClear center,CLEAR
;------
x:=(wa*1)/xx,y:=(ha*1)/xx,h:=(ha*15)/xx,w:=(wa*20)/xx
Gui,2: Show         , x%x% y%y%  w%w%  h%h%,%filename1%
Guicontrol,2:Focus,C1
SendInput , {end}
return
;-------------
2Guiclose:
exitapp
;-------------
Clear:
Gui,2:submit,nohide
Guicontrol,2:,C1,
Guicontrol,2:,C2,
return
;-------------
A1:
Gui,2:submit,nohide
result:=(C1/2)*3           
Guicontrol,2:,C2,%result%
return
;=========================================================================
Last edited by garry on 29 May 2021, 14:09, edited 1 time in total.

User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Dúvidas matemáticas (muitos zeros no resultado)

Post by Gio » 28 May 2021, 08:33

Bom dia Tilo.

Seja bem-vindo ao fórum da comunidade do AutoHotkey.

Vou começar pela pergunta mais simples.
como fazer com que eles não apareçam numa próxima tentativa com scripts para fazer contas/equações/resolver_coisas_matemáticas?
Você pode fazer isso de várias formas. Um exemplo é usando a função embutida Round() para definir manualmente o número de casas decimais (arrendondando o número caso o número de casas ultrapasse esse montante). No caso do exemplo postado, o arredondamento simplesmente removeria as casas decimais com zeros.

Exemplo:

Code: Select all

InputBox, num, , , , 180, 100, , , , ,
Var1 := Round(num / 2 * 3)
Var2 := Round(num / 3 * 2)

MsgBox %Var1% / %Var2%

:arrow: OBS: perceba que round pode forçar um número qualquer de casas decimais no resultado se você identificar isso no segundo parâmetro da função (exemplo: Round(2.335,2) tem como resultado 2.34 e não simplesmente 2.


Agora vamos para a pergunta mais "complexa"

Mas porque aparece esse monte de zeros[?]

Isso tem a ver entre outras coisas com o funcionamento da memória dos computadores. A menor porção de memória endereçavel é um byte (então por exemplo, para acessar bits individuais um programa tem que acessar o byte e depois trabalhar ele para isolar o bit em questão, pois o bit não é diretamente acessível).

Parece algo pequeno, mas isso gera um problema considerável para se obter a eficiência máxima de armazenamento de informações pelos programas versus obter a máxima precisão de cálculo possível (diferenciar 0.9999999 e 1, por exemplo).

Por conta disso, a maioria das linguagens de programação requer que toda variável seja declarada indicando-se um tipo específico (por exemplo float ou integer). Ao fazer isso, o programador (supostamente conhecedor das vantagens e desvantagens de cada tipo) é o responsável por obter (ou não) a eficiência máxima do armazenamento para o seu programa.

Ocorre que no AutoHotkey a preferência é pela programação facilitada, de modo que o programador não é obrigado a declarar o tipo de variável para cada variável do seu programa. Para que isso funcione, no entanto, o próprio AutoHotkey decide internamente qual tipo usar, de modo que dependendo do que você fizer com a variável, ele vai armazenar o resultado como integer ou como float, por exemplo.

Sendo assim você tem duas opções: OU você simplesmente aceita (manipulando se preciso) o tipo que o autohotkey define por padrão (mais fácil e prático) OU você mesmo define o tipo que quer (mais trabalhoso, porém com maior controle).

O comando Round() não manipula o tipo de dados das variáveis do programa em geral (tal como o comando SetFormat faz), mas com ele o AutoHotkey já é capaz de escolher melhor como armazenar os dados DAQUELA variável específica, pois você nesse comando você define explicitamente como o valor da variável deve ser exibido.

:arrow: OBS: Se você quiser usar Round(), tenha em mente que ele deve ser usado sobre o valor final do cálculo. No exemplo abaixo, vemos que usar Round() no meio da fórmula NÃO indica ao autohotkey como deve ser o valor final:

Code: Select all

InputBox, num, , , , 180, 100, , , , ,
Var1 := Round(num) / 2 * 3 ; Aqui aplicamos sobre um componente da fórmula, o que não vai mudar a interpretação do AutoHotkey neste caso.
Var2 := Round(num / 3 * 2) ; Já aqui aplicamos sobre o valor final, o que vai fazer o autohotkey armazenar o número desse mesmo jeito.

MsgBox %Var1% / %Var2%
:arrow: Dica: Você só deve se preocupar com isso se for EXIBIR um valor ao usuário. Enquanto isso não acontecer, deixe o AutoHotkey calcular do jeito dele mesmo. Isso facilita muito a sua programação e garante uma precisão maior nos cálculos.

Post Reply

Return to “Ajuda e Suporte Geral”