double int no Harbour?

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

double int no Harbour?

Mensagem por JoséQuintas »

Acho que a confusão foi por causa do título do tópico.
Não sei se double int é suficiente para o número.
E além disso, como é que o Harbour vai passar um número que ele próprio não aceita?

x = número inválido pra Harbour
c_Double( x, 97 )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

double int no Harbour?

Mensagem por Itamar M. Lins Jr. »

Ola!
In case of numeric values it's the same as in Clipper and
most of other languages - on platforms you are using it's
limited by IEEE758 double value specification. By Przemek
A questão é: Qual é a linguagem que aceita ? Pq, isso é um problema do hardware até onde sei.
Tem alguma gambiarra que eles fazem para burlar isso... até onde sei. E tem o problema do 16,32,64 bits, e o Harbour segue o padrão dos OS, assim como qualquer linguagem, é limitada pelo Sistema Operacional.
Na linguagem C, ao declararmos uma variável, o compilador reserva na memória o espaço necessário para representá-la. Como esse espaço é fixo (por exemplo, 32 bits), é possível que durante uma computação o número de bits utilizado não seja suficiente para representar os valores necessários, e nesse caso, os resultados são, obviamente, inválidos.

Dependendo do maior/menor número que seu programa precisa representar, além de int você pode declarar variáveis inteiras como long (para usar palavras de 64 bits), short (para usar palavras de 16 bits) e cada uma dessas como unsigned, para representar só números positivos, ou seja, um unsigned short é capaz de representar números de 0 a 2^{16}-1=65535
https://www.ime.usp.br/~elo/IntroducaoC ... 0reais.htm

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

double int no Harbour?

Mensagem por JoséQuintas »

Você está quase certo..... ou errado.... kkkk

Sim. existe um problema antigo sobre cálculo em ponto flutuante.
Mas neste caso é número inteiro.

Mas, por mais que o programa em C consiga fazer o cálculo, ainda temos o problema de que o número original sai do Harbour, com precisão de 16 dígitos, mesmo pra números inteiros.

3333333333333333333333

isso em Harbour, provavelmente vira

33333333333333330000

Se passar para o C.... mesmo que possa ter capacidade maior, vai entrar errado.

Mas o problema inicial ficou resolvido, agora estamos decifrando diferenças em cálculos C, e integração Harbour com C.
Talvez seja interessante tratar em outro tópico.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

double int no Harbour?

Mensagem por Itamar M. Lins Jr. »

Ola!
Ue?
Mas neste caso é número inteiro.
É inteiro mesmo. Veja o tal IEE... que é um padrão para confecção do circuito... Nível do hardware mesmo.
https://docs.microsoft.com/pt-br/cpp/cp ... ew=vs-2019

Código: Selecionar todos

ULLONG_MAX 	Valor máximo para uma variável do tipo longo longo sem sinal 	18446744073709551615 (0xffffffffffffffff) 
20 caracteres, 64Bits

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

double int no Harbour?

Mensagem por Itamar M. Lins Jr. »

Ola!
Acima de 16 dígitos... Isso é um problema para os Venezuelanos...
https://g1.globo.com/economia/noticia/2 ... maio.ghtml

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

double int no Harbour?

Mensagem por JoséQuintas »

De fato, o Fundo Monetário Internacional (FMI) prevê que a inflação no país chegará a 10.000.000% ao fechamento de 2019.
ponte que caiu.... 7 dígitos a cada ano.... acho que nem tem cálculo no computador pra tanto.
o cara pede um empréstimo de 1 "real", pra pagar em um ano, e vai ter que pagar 10 milhões !!!
ou o contrário... o cara tem 10 milhões pra comprar uma frota de carros, que daqui a um ano não pagam o almoço.
Isso é pior do que era o Brasil antes do real, o que mostra que política é uma grande merd.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

double int no Harbour?

Mensagem por asimoes »

Consegui resolver esse enigma usando a função em C, os valores tem que ir como string, é feita a conversão na função
para HB_ULONGLONG usando strtoull

nResto := C_Resto("11111112222344555555","97")

nResto = 25

Código: Selecionar todos


#pragma BEGINDUMP

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

HB_FUNC ( C_RESTO )
{
        
  HB_ULONGLONG    parax1;
  HB_ULONGLONG    parax2;
   
  double resulta;
   
  const char * para1 = hb_parcx(1);
  
  const char * para2 = hb_parcx(2);
  
  parax1 = strtoull(para1, &parax1, 10); 

  parax2 = strtoull(para2, &parax2, 10); 
 
  resulta = (parax1 % parax2);
  
  hb_retnl( 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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

double int no Harbour?

Mensagem por asimoes »

Convert string to unsigned long long integer
Parses the C-string str interpreting its content as an integral number of the specified base, which is returned as a value of type unsigned long long int. If endptr is not a null pointer, the function also sets the value of endptr to point to the first character after the number.

This function operates like strtol to interpret the string, but produces numbers of type unsigned long long int (see strtol for details on the interpretation process).

strtoull

Parameters

str
C-string beginning with the representation of an integral number.
endptr
Reference to an object of type char*, whose value is set by the function to the next character in str after the numerical value.
This parameter can also be a null pointer, in which case it is not used.
base
Numerical base (radix) that determines the valid characters and their interpretation.
If this is 0, the base used is determined by the format in the sequence (see strtol for details).

Return Value
On success, the function returns the converted integral number as an unsigned long long int value.
If no valid conversion could be performed, a zero value is returned (0ULL).
If the value read is out of the range of representable values by an unsigned long long int, the function returns ULLONG_MAX (defined in <climits>), and errno is set to ERANGE.

Fonte:

http://www.cplusplus.com/reference/cstdlib/strtoull/
►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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

double int no Harbour?

Mensagem por asimoes »

A limitação está a cargo do compilador usado: BCC, MINGW etc, em 32 e 64bits

ULLONG_MAX Maximum value for an object of type unsigned long long int 18446744073709551615 (264-1) or greater*
2 elevado a 64 - 1

Fonte: http://www.cplusplus.com/reference/climits/
►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)
Responder