FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour FWH 64 bits 10.9 ya está disponible
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
FWH 64 bits 10.9 ya está disponible
Posted: Fri Oct 08, 2010 08:08 AM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: FWH 64 bits 10.9 ya está disponible
Posted: Sun Feb 27, 2011 04:09 PM
Antonio / Daniel
He estado haciendo algunas pruebas con FWH64 y la version de Harbour indicada en el website de FiveTechSoft.
Lo ejemplos que he tratado han compilado OK, incluyendo algunos que usan browse, y parecen estar funcionando bien.

El problema lo veo con algunas funciones cuando usan numeros grandes.
Por ejemplo la funcion CtoN(<cDigits> , [<nBase>] ,[<lNegative>]) --> nInteger
usada para convertir una cadena de caracteres en un numero entero no funciona correctamente si la cadena de caracteres tiene 54 digitos o mas.

Ejemplo A) String binario con 54 digitos
cDigits := "111010111111111110110101010101010101010101010101010111"
CtoN(cDigits,2) = 16606943453205848 (incorrecto)
Lo correcto seria 16606943453205847

Ejemplo B) String binario con 58 digitos
cDigits := "1010111010111111111110110101010101010101010101010101010111"
CtoN(cDigits,2) = 196750928548025660 (incorrecto)
El N. correcto es: 196750928548025687


Igualmente si usamos el siguiente programa en lenguaje C:

Code (fw): Select all Collapse
#pragma BEGINDUMP

#include <hbapi.h>
#include <math.h>

HB_FUNC( TESTEXP )

{
long double, nBase = 2, nResult;

nResult = pow(nBase,57);    // Hasta el 56 presenta resultados correctos; luego da resultado erroneos
hb_retnd(nResult);
    }
#pragma ENDDUMP


Para el ejemplo anterior:
Resultado del programa es: 144115188075855900 (incorrecto)
El resultado correcto seria: 144115188075855872

La calculadora "Windows", que viene en Windows 7 Profesional, corriendo en mi computador de 64 bits presenta siempre los valores correctos.

Seria posible obtener los resultados correctos usando CtoN() para cadenas de digitos binarios hasta 64 bits?
Como podemos cambiar el codigo C anterior para obtener los resultados correctos utilizando nBase = 2 elevado hasta 64?

Saludos


George
Posts: 610
Joined: Wed Oct 19, 2005 08:20 PM
Re: FWH 64 bits 10.9 ya está disponible
Posted: Sun Feb 27, 2011 09:14 PM

Hola George,
Ese problema ya se me presentó tambien en FWH 32 bit y no parece que sea problema de FWH sino del compilardor.
Mírate esto: viewtopic.php?f=6&t=20103&p=106196#p106196

Un saludo,

Manuel



xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: FWH 64 bits 10.9 ya está disponible
Posted: Mon Feb 28, 2011 01:37 AM

Gracias Manuel por responder.
Estoy de acuerdo contigo, desde el primer momento que vi este problema, que no tiene que ver nada con FWH64.
Parece ser mas bien un problema de harbour.
Lo que no entiendo es porque tambien el codigo C del ejemplo de arriba, codificado dentro de harbour, presenta el resultado incorrecto en operaciones pow(nBase, nExp), donde nBase = 2 y cuando nExp >= 57.

Por otra parte en las pruebas que he realizado en operaciones con notacion Hexadecimal no he encontrado falla, aqui si podemos manejar los numeros grandes y pasar a de Hex a Dec y viceversa sin problemas.

Saludos

George

Posts: 337
Joined: Fri Oct 07, 2005 02:44 PM
Re: FWH 64 bits 10.9 ya está disponible
Posted: Tue Mar 01, 2011 06:09 PM

Hola,

Disculpen que salte a la conversación, pero el problema que mencionan, según recuerdo, es del bcc no del harbour.

Atte.,

Lautaro Moreira

Hola,

Soy un Contador que por necesidad aprendio a programar y se quedo programando.
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: FWH 64 bits 10.9 ya está disponible
Posted: Tue Mar 01, 2011 07:16 PM
Lautaro,

Estoy usando el compilador de Microsoft "msvc" (el que trae FWH64 y que se instala en el directorio VC64) y no el "bcc" de Borland:

Code (fw): Select all Collapse
@ECHO OFF
CLS
ECHO ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ECHO ³ FWH 64 for Harbour 10.9 (MSVC++) Sep. 2010       Harbour development power ³Ü
ECHO ³ (c) FiveTech, 1993-2010     for Microsoft Windows 9X/NT/200X/ME/XP/Vista/7 ³Û
ECHO ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÛ
ECHO ÿ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß

if A%1 == A GOTO :SINTAX
if NOT EXIST %1.prg GOTO :NOEXIST

if "%FWDIR%" == "" set FWDIR=.\..
if "%HBDIR%" == "" set HBDIR=F:\harbour64

ECHO Compiling...

set hdir=%HBDIR%
set hdirl=%hdir%\lib\vc64
set vcdir=F:\vc64
set include=%vcdir%\include;%hdir%\include;%include%
set lib=%vcdir%\lib;%hdir%\lib;%lib%

%hdir%\bin\harbour %1 /n /i%fwdir%\include;%hdir%\include /w /p %2 %3 > comp.log
IF ERRORLEVEL 1 GOTO COMPILEERROR
@type comp.log

%vcdir%\bin\cl -TP -W3 -c %1.c
:ENDCOMPILE

IF EXIST %1.rc %vcdir%\bin\rc -r -D__64__ %1

echo %1.obj  > msvc.tmp

echo %fwdir%\lib\FiveH64.lib %fwdir%\lib\FiveHC64.lib  >> msvc.tmp

echo %hdirl%\hbrtl.lib  >> msvc.tmp
echo %hdirl%\hbvm.lib  >> msvc.tmp
echo %hdirl%\gtgui.lib  >> msvc.tmp
echo %hdirl%\hblang.lib  >> msvc.tmp
echo %hdirl%\hbmacro.lib  >> msvc.tmp
echo %hdirl%\hbrdd.lib  >> msvc.tmp
echo %hdirl%\rddntx.lib  >> msvc.tmp
echo %hdirl%\rddcdx.lib  >> msvc.tmp
echo %hdirl%\rddfpt.lib  >> msvc.tmp
echo %hdirl%\hbsix.lib  >> msvc.tmp
echo %hdirl%\hbdebug.lib  >> msvc.tmp
echo %hdirl%\hbcommon.lib  >> msvc.tmp
echo %hdirl%\hbpp.lib  >> msvc.tmp
echo %hdirl%\hbcpage.lib  >> msvc.tmp
echo %hdirl%\hbwin.lib  >> msvc.tmp
echo %hdirl%\hbct.lib  >> msvc.tmp
echo %hdirl%\hbziparc.lib >> msvc.tmp
echo %hdirl%\hbmzip.lib >> msvc.tmp
echo %hdirl%\hbzlib.lib >> msvc.tmp
echo %hdirl%\minizip.lib >> msvc.tmp
echo %hdirl%\xhb.lib >> msvc.tmp

rem Uncomment these two lines to use Advantage RDD
rem echo %hdirl%\rddads.lib >> msvc.tmp
rem echo %hdirl%\ace32.lib >> msvc.tmp

echo %vcdir%\lib\kernel32.lib  >> msvc.tmp
echo %vcdir%\lib\user32.lib    >> msvc.tmp
echo %vcdir%\lib\gdi32.lib     >> msvc.tmp
echo %vcdir%\lib\winspool.lib  >> msvc.tmp
echo %vcdir%\lib\comctl32.lib  >> msvc.tmp
echo %vcdir%\lib\comdlg32.lib  >> msvc.tmp
echo %vcdir%\lib\advapi32.lib  >> msvc.tmp
echo %vcdir%\lib\shell32.lib   >> msvc.tmp
echo %vcdir%\lib\ole32.lib     >> msvc.tmp
echo %vcdir%\lib\oleaut32.lib  >> msvc.tmp
echo %vcdir%\lib\uuid.lib      >> msvc.tmp
echo %vcdir%\lib\odbc32.lib    >> msvc.tmp
echo %vcdir%\lib\odbccp32.lib  >> msvc.tmp
echo %vcdir%\lib\iphlpapi.lib  >> msvc.tmp
echo %vcdir%\lib\mpr.lib       >> msvc.tmp
echo %vcdir%\lib\version.lib   >> msvc.tmp
echo %vcdir%\lib\wsock32.lib   >> msvc.tmp
echo %vcdir%\lib\msimg32.lib   >> msvc.tmp
echo %vcdir%\lib\oledlg.lib   >> msvc.tmp

IF EXIST %1.res echo %1.res >> msvc.tmp

%vcdir%\bin\link @msvc.tmp /nologo /subsystem:windows /force:multiple /NODEFAULTLIB:libc

IF ERRORLEVEL 1 GOTO LINKERROR
ECHO * Application successfully built *
%1
GOTO EXIT
ECHO

rem delete temporary files
@del %1.c
@del msvc.tmp

:COMPILEERROR
@type comp.log
ECHO * Compiling errors *
GOTO EXIT

:LINKERROR
ECHO * Linking errors *
GOTO EXIT

:SINTAX
ECHO    SYNTAX: Build [Program]     {-- No especifiques la extensi¢n PRG
ECHO                                {-- Don't specify .PRG extension
GOTO EXIT

:NOEXIST
ECHO The specified PRG %1 does not exist

:EXIT


Es posible, como tu indicas, que el problema este en el compilador.
Sin embargo esta version de "msvc" se supone que es la que se utiliza con Windows 64 bits.

Esperemos por la opinion de Antonio o Daniel.

George
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Re: FWH 64 bits 10.9 ya está disponible
Posted: Wed Mar 02, 2011 12:56 PM

Creo que el problema no es ni siquiera de C, sino del tipo double. El tipo double es una representación de números reales, y tiene una cantidad de dígitos de presición limitada. Esto seguro aclara el tema:

http://es.wikipedia.org/wiki/Double

Está perfectamente explicado, espero que les resulte interesante y ayude a aclarar dudas.

Como curiosidad, algunos lenguajes más nuevos como python si manejan números (internamente no se como) del tipo 2^7869 con todos los dígitos. Me sorprendió bastante.

Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: FWH 64 bits 10.9 ya está disponible
Posted: Thu Mar 03, 2011 03:18 AM
Saludos

por lo que veo estas limitando el retorno

pruebalo asi

Code (fw): Select all Collapse
hb_retnll( ( LONGLONG ) nResult );
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: FWH 64 bits 10.9 ya está disponible
Posted: Thu Mar 03, 2011 02:28 PM
Daniel,
Despues de algunas pruebas he encontrado que en ambos casos el resultado esta siendo calculado correctamente por la funcion pow().
El problema esta cuando utilizamos msginfo() para presentar el resultado.

Code (fw): Select all Collapse
  nResult = TEST_EXP_FUNC()
 msginfo(nResult) // Presenta resultado truncado
 ? nresult        // Presenta resultado correcto


Saludos


George

Continue the discussion