double int no Harbour?
Moderador: Moderadores
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
double int no Harbour?
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 )
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/
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/
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
double int no Harbour?
Ola!
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.
Saudações,
Itamar M. Lins Jr.
A questão é: Qual é a linguagem que aceita ? Pq, isso é um problema do hardware até onde sei.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
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.
https://www.ime.usp.br/~elo/IntroducaoC ... 0reais.htmNa 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
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
double int no Harbour?
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.
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/
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/
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
double int no Harbour?
Ola!
Ue?
https://docs.microsoft.com/pt-br/cpp/cp ... ew=vs-2019
20 caracteres, 64Bits
Saudações,
Itamar M. Lins Jr.
Ue?
É inteiro mesmo. Veja o tal IEE... que é um padrão para confecção do circuito... Nível do hardware mesmo.Mas neste caso é número inteiro.
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) Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
double int no Harbour?
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.
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.
Itamar M. Lins Jr.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
double int no Harbour?
ponte que caiu.... 7 dígitos a cada ano.... acho que nem tem cálculo no computador pra tanto.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.
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/
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/
double int no Harbour?
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
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, ¶x1, 10);
parax2 = strtoull(para2, ¶x2, 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)
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)
double int no Harbour?
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/
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)
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)
double int no Harbour?
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/
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)
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)
