Clipper On Line • Ver Tópico - double int no Harbour?

double int no Harbour?

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

double int no Harbour?

Mensagempor ArnaldoND » 15 Jul 2019 13:43

como inicializar uma variavel double int no harbour?

preciso de uma variavel numerica muito grande, pois fiz uma função que faz a consistencia do digito de verificação do numero do processo do TJSP, cujo calculo se baseia em:

1111111-DD-2222-3-44-555555

onde:
DD = 98 - MOD ( 11111112222344555555 , 97 )
ou
DD = 98 - ( 11111112222344555555 % 97 )

Quando 1111111 está "cheio", a função está calculando errado! acredito q se deva ao tamanho do numero , que é inteiro.. porque? se eu calculo o seguinte numero de processo: 0004939-48-2013-8-26-029900, o resultado é OK (retorna-me 48), porém, se eu tento 1044645-26-2019-8-26-010000, retorna um numero nada a ver, provavelmente devido à truncamento durante a manipulação da variavel
ArnaldoND
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 23
Data de registro: 23 Jan 2019 15:12
Cidade/Estado: são paulo/sp
Curtiu: 13 vezes
Mens.Curtidas: 0 vez

double int no Harbour?

Mensagempor JoséQuintas » 15 Jul 2019 14:33

Talvez dividir no meio e fazer em duas etapas.
A precisão numérica é de 16 caracteres, e aí tem mais que isso.
Supondo que sejam 22 dígitos, dois blocos de 11.
Como na primeira operação vai sobrar no máximo 96, concatenado ao segundo vão ser apenas 13.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

double int no Harbour?

Mensagempor JoséQuintas » 15 Jul 2019 14:38

Direto no fórum, não testei....

cNumeroGrande := Padl( cOriginal, 24 )

cParte1 := Substr( cNumeroGrande, 1, 12 )
nResto := Mod( Val( cParte1 ), 97 )

cParte2 := StrZero( nResto, 2 ) + Substr( cNumeroGrande, 13 )
nResto := Mod( Val( cParte2 ), 97 )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

double int no Harbour?

Mensagempor asimoes » 15 Jul 2019 14:49

Tenho esse fonte veja se te ajuda:

Incluir no hpb

Funções:

C_SUM -> Soma
C_SUB ->Subtração
C_MULT -) Multiplicação
C_DIV - Divisão
Anexos
C_OPER.C
Operações
(4.35 KiB) Baixado 69 vezes
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

double int no Harbour?

Mensagempor ArnaldoND » 15 Jul 2019 15:11

JoseQuintas, tua solução foi perfeita... a matemática é fascinante kkk
obrigado
ArnaldoND
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 23
Data de registro: 23 Jan 2019 15:12
Cidade/Estado: são paulo/sp
Curtiu: 13 vezes
Mens.Curtidas: 0 vez

double int no Harbour?

Mensagempor JoséQuintas » 15 Jul 2019 15:39

É parecido com o que a gente faz "a caneta", exceto que não olhamos pelos zeros

85 / 3

8 / 3 = 2 sobra 2
junta o 2 no 5 que tinha sobrado temos 25
25 / 3 = 8 sobra 1

Nessa divisão em duas partes... é como se fosse 80 / 30, que sobra 20, trabalhando tudo na mesma grandeza, dezena.
"2" + "5", por causa da posição do número, o 2 acaba representando os 20, sem precisar fazer outra conta.
Digamos que é usar truques, pra facilitar contas.

Basicamente o mesmo jeito de fazer "a caneta", mas ajustado para quantidade de casas que o Harbour "aguenta", pra não precisar muita conta.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

double int no Harbour?

Mensagempor asimoes » 15 Jul 2019 17:14

Não sei qual é o resultado esperado na sua rotina

? C_RESTO( NN, DD)

#pragma BEGINDUMP

#include <windows.h>
#include <windef.h>
#include <tlhelp32.h>
#include <hbapi.h>
#include <hbapiitm.h>

HB_FUNC ( C_RESTO )
{
       
  ULONGLONG para1;
  ULONGLONG para2;
  ULONGLONG resulta;
       
  para1 = hb_parnint(1);
  para2 = hb_parnint(2);

  resulta = (para1 % para2);

  hb_retnll(resulta);

}
#pragma ENDDUMP
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

double int no Harbour?

Mensagempor JoséQuintas » 15 Jul 2019 17:41

asimoes escreveu:Não sei qual é o resultado esperado na sua rotina


Inverto a pergunta:
Como vai passar os números com mais de 16 dígitos, se o limite do Harbour é 16 dígitos?

? c_Resto( 55555555555555555555, 33333333333333333333)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

double int no Harbour?

Mensagempor JoséQuintas » 15 Jul 2019 17:53

Xi..... Fiz uns testes...

PROCEDURE Main

   LOCAL a, b

   a := 555555555555555555555
   b := 333333333333333333333
   ? c_Resto( a, b )
   Inkey(0)

   RETURN


Retornou zero
Acho que acabou com limite baixo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

double int no Harbour?

Mensagempor JoséQuintas » 15 Jul 2019 17:59

O difícil agora é conferir kkkk


PROCEDURE Main

   LOCAL a, b

   a := 555555555555555555555
   b := 97
   ? c_Resto( a, b )
   ? Resto( "555555555555555555555", 97 )
   Inkey(0)

   RETURN

#pragma BEGINDUMP

#include <windows.h>
#include <windef.h>
#include <tlhelp32.h>
#include <hbapi.h>
#include <hbapiitm.h>

HB_FUNC ( C_RESTO )
{

  ULONGLONG para1;
  ULONGLONG para2;
  ULONGLONG resulta;

  para1 = hb_parnint(1);
  para2 = hb_parnint(2);

  resulta = (para1 % para2);

  hb_retnll(resulta);

}
#pragma ENDDUMP

FUNCTION Resto( cOriginal, nDivide )

   LOCAL cNumeroGrande, cParte1, cParte2, nResto

cNumeroGrande := Padl( cOriginal, 24 )

cParte1 := Substr( cNumeroGrande, 1, 12 )
nResto := Mod( Val( cParte1 ), nDivide )

cParte2 := StrZero( nResto, 2 ) + Substr( cNumeroGrande, 13 )
nResto := Mod( Val( cParte2 ), nDivide )

RETURN nResto


Um retorna 79 e outro 17
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

double int no Harbour?

Mensagempor JoséQuintas » 15 Jul 2019 18:07

Solução pro teste mais fácil:


PROCEDURE Main

   LOCAL a, b

   a := 333333333333333333333
   b := 3
   ? c_Resto( a, b )
   ? Resto( "333333333333333333333", b )
   Inkey(0)

   RETURN


Em C sobra 2, o que é errado, porque o número é divisível por 3....
Realmente o limite não é suficiente para o cálculo que precisa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

double int no Harbour?

Mensagempor JoséQuintas » 15 Jul 2019 18:13

Correção:
os parâmetros numéricos acabam recebendo o número de precisão limitada do Harbour.
Precisa de cuidado sobre aonde ela pode ajudar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

double int no Harbour?

Mensagempor asimoes » 15 Jul 2019 20:52

Quintas,

Pode testar por aqui:
https://www.4devs.com.br/resto_da_divisao
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

double int no Harbour?

Mensagempor asimoes » 15 Jul 2019 21:29

Em C pode-se usar fmod ou %
#pragma BEGINDUMP

#include <windows.h>
#include <windef.h>
#include <tlhelp32.h>
#include <hbapi.h>
#include <hbapiitm.h>

HB_FUNC ( C_RESTO )
{
       
  ULONGLONG para1;
  ULONGLONG para2;
  double resulta;
       
  para1 = hb_parnint(1);
  para2 = hb_parnint(2);

  //resulta = (para1 % para2); // ou usando fmod
 
  resulta = fmod( para1, para2 );
 
  hb_retnd(resulta); // retorna double
 
  //hb_retni(resulta); //retorna integer

}
#pragma ENDDUMP
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

double int no Harbour?

Mensagempor asimoes » 15 Jul 2019 21:33

Função Mod do harbour
/*
* Mod() function
*
* Copyright 1999 Matthew Hamilton <mhamilton@bunge.com.au>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file LICENSE.txt.  If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA (or visit https://www.gnu.org/licenses/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour.  If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way.  To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapierr.h"
#include "hbmath.h"

/* NOTE: In CA-Cl*pper this is written in Clipper, see the source below,
         and the error handling is NOT made here, but in the % operator.
         [vszakats] */

/* NOTE: CA-Cl*pper is buggy since it relies on the fact that the errorhandler
         will silently handle zero division errors. [vszakats] */

/* NOTE: This C version fully emulates the behaviour of the original
         CA-Cl*pper version, including bugs/side-effects. [vszakats] */

HB_FUNC( MOD )
{
   PHB_ITEM pNumber = hb_param( 1, HB_IT_NUMERIC );
   PHB_ITEM pBase   = hb_param( 2, HB_IT_NUMERIC );

   if( pNumber && pBase )
   {
      double dNumber = hb_itemGetND( pNumber );
      double dBase   = hb_itemGetND( pBase ); /* dBase! Cool! */

      if( dBase )
      {
         double dResult = fmod( dNumber, dBase );

         if( dResult && ( dNumber > 0 ? dBase < 0 : dBase > 0 ) )
            dResult += dBase;
         hb_retnd( dResult );
      }
      else
      {
         PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ZERODIV, 1341, NULL, "%", HB_ERR_ARGS_BASEPARAMS );

         /* In CA-Cl*pper Mod() function ignores substitution result
          * and return original numeric item keeping its internal
          * representation: integer or double, size and number of
          * decimal places, it can be seen in code like:
          *    PROCEDURE Main()
          *       Set( _SET_FIXED, .T. )
          *       ? Transform( Mod( 12345, 0 ), "" )
          *       RETURN
          *
          * [druzus]
          */
         if( pResult )
         {
            hb_itemReturn( pNumber );
            hb_itemRelease( pResult );
         }
      }
   }
   else
      hb_errRT_BASE_SubstR( EG_ARG, 1085, NULL, "%", 2, hb_param( 1, HB_IT_ANY ), hb_param( 2, HB_IT_ANY ) );
}

/*
   FUNCTION Mod( cl_num, cl_base )

      LOCAL cl_result := cl_num % cl_base

      RETURN iif( cl_base = 0, cl_num, iif( cl_result * cl_base < 0, cl_result + cl_base, cl_result ) )
*/
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot], Google Adsense [Bot] e 9 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro