tokyo studio keygen full embarcadero descargar crack delphi 64bit delphi-10.2-tokyo

delphi - keygen - rad studio 10.2 tokyo full download



StrToFloat no puede reportar números de punto flotante no válidos en Delphi 64bits (1)

Este es un defecto que está presente en todas las versiones de Delphi que usan la versión StrToFloat de StrToFloat . Eso se asigna a InternalTextToExtended que lee el exponente de esta manera:

function ReadExponent: SmallInt; var LSign: SmallInt; begin LSign := ReadSign(); Result := 0; while LCurrChar.IsDigit do begin Result := Result * 10; Result := Result + Ord(LCurrChar) - Ord(''0''); NextChar(); end; if Result > CMaxExponent then Result := CMaxExponent; Result := Result * LSign; end;

El problema es la ubicación de

if Result > CMaxExponent then

Esta prueba está destinada a estar dentro del bucle, y en la versión asm x86 de este código es. Como se codificó anteriormente, con la prueba del exponente máximo fuera del bucle, el valor del resultado entero con signo de 16 bits es demasiado pequeño para su exponente de 99999999 . A medida que se lee el exponente, el valor en Result desborda y se vuelve negativo. Entonces, para su ejemplo, resulta que se usa un exponente de -7937 lugar de 99999999 . Naturalmente, esto lleva a un valor de cero.

Este es un error claro y he enviado un informe de error: RSP-20333 .

En cuanto a cómo solucionar el problema, no conozco otra función en el Delphi RTL que realice esta tarea. Así que creo que tendrás que hacer uno de los siguientes:

  • Roll su propio StrToFloat .
  • StrToFloat la cadena y maneje los exponentes fuera de rango antes de que lean StrToFloat .
  • Utilice una de las funciones de la biblioteca en tiempo de ejecución de C que realiza la misma tarea.

Finalmente, le agradezco que haga esta pregunta porque veo que mi defecto afecta a mi propio programa y, por lo tanto, ¡ahora puedo solucionarlo!

Actualizar:

También puede interesarle ver un error relacionado que encontré al investigar: RSP-20334 . Le sorprenderá darse cuenta de que StrToFloat(''߀'') , al usar la versión StrToFloat de StrToFloat , devuelve 1936.0 . El truco es que el carácter que se pasa a StrToFloat es un dígito no latino, en este caso U+07C0 .

El siguiente código que intenta convertir un valor mucho más allá del rango de doble precisión

StrToFloat(''1e99999999'')

informa correctamente un valor de punto flotante incorrecto en Delphi 10.2r3 con el compilador de Windows de 32 bits, pero cuando se compila con el compilador de Windows de 64 bits, devuelve silenciosamente un 0 (cero).

¿Hay alguna manera de que StrToFloat informe un error cuando el valor del punto flotante es incorrecto?

He intentado TArithmeticException.exOverflow, pero esto no tiene ningún efecto en ese caso.

También probé TArithmeticException.exPrecision pero se dispara en muchos casos de aproximación habituales (se dispara al convertir ''1e9'').

El problema se notó con Delphi 10.2 actualización 3

Addendum: para solucionar el problema, comencé una implementación alternativa de limpieza de cadenas a doble conversión, la versión inicial con pruebas se puede encontrar en dwscript commit 2ba1d4a