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:
#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 ENDDUMPPara 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