#1419 closed defect (fixed)
La función Round no redondea bien
Reported by: | Owned by: | Víctor de Buen Remiro | |
---|---|---|---|
Priority: | normal | Milestone: | Mantainance |
Component: | Kernel | Version: | 2.0.1 |
Severity: | normal | Keywords: | |
Cc: |
Description
Hola TOL, la función round no redondea bien con algunos numeros reales y los decimales elegidos, os paso un ejemplo:
Real Round(0.008652760000000001,6);
Change History (4)
comment:1 Changed 13 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:3 Changed 13 years ago by
Si lo que se pretende es escribir en algún fichero de tipo tabla .bst, .bdt, .bmt, ...
, entonces no se trata de un problema de redondeo artimético sino de formato de texto, lo cual se puede resolver con el uso de PutRealFormat
Por ejemplo, el siguiente código escribirá un fichero "c:/tmp/x.bmt" con el número "0.008653"
Text PutRealFormat("%.6lf"); Matrix x = Constant(1,1,0.008652760000000001); Set BMTFile([[x]],"c:/tmp/x.bmt"); Matrix x_ = Include("c:/tmp/x.bmt")[1]; Real MatDat(x_,1,1);
Una vez realizadas las operaciones deseadas recuérdese recobrar la máxima precisión pues esto podría afectar a operaciones de escritura posteriores causando problemas imprevisibles:
Text PutRealFormat("%.16lg");
Bienvenido al fabuloso mundo de la aritmética discreta. Lo que ocurre es que en realidad el número que esperas no existe en la aritmética de 64 bits que usamos en TOL, que es la que usa C y todos los programas en general. Es algo que depende de la arquitectura de la máquina pero pasa en todas de una forma u otra. Lo que se devuelve es el número más cercano al que debería ser y que es expresable en aritmética de 64 bits.
Si ejecutas este código podrás verlo más claro
En R pasa exactamente lo mismo, aunque para verlo hay que forzar la máxima precisión de salida