On May 14, 2015, at 12:50 PM, David Winsemius wrote: > > On May 14, 2015, at 1:44 AM, chasiot...@math.auth.gr wrote: > >> Hello, >> >> I am Vasilis Chasiotis and I am a candidate Ph.D. student in Aristotle >> University of Thessaloniki in Greece. >> >> I have the following problem. >> >> I want to check if the square of a number ( for example the square of >> 1.677722e+29 ) is an integer. >> > > The square of 1.677722e+29 is almost certainly an integer since the power of > 10 (+29) exceeds the number of digits. That implies that the number in > non-scientific notation has many 0's on the righthand side. > > I'm guessing that you may be asking whether the square-root is an integer. > >> The problem is that this number is the calculation of the determinant (so >> the number should be an integer) of a matrix 22x22, which means it has an >> approximation ( the "real" number is 1.6777216e+29 but R gives to me >> 1.6777215999999849e+29 ), because R use LU-decomposition to calculate the >> determinant. >> >> That means that the radical of the number 1.6777215999999849e+29 is not an >> integer, but it should be. > > Again guessing that by 'radical' you mean the square-root. I am also confused > about what test you were applying to that result to determine that it was > not an integer. > > At any rate, I'm guessing that the limitation of R's numerical accuracy may > get in the way of determining whether the square-root is an integer. If it > were integer then it should equal floor(n) : > > (1.6777215999999849e+29)^(1/2) - floor((1.6777215999999849e+29)^(1/2)) > #[1] 0.125 > > (1.6777216e+29)^(1/2) - floor( (1.6777216e+29)^(1/2) ) > #[1] 0 > > That's because that number was the product of two perfect squares: > >> 16777216^(1/2) - floor( 1.6777216^(1/2) ) > [1] 4095
Sorry: Meant to copy this to the response: > 16777216^(1/2) - floor( 16777216^(1/2) ) [1] 0 > 16777216^(1/2) [1] 4096 > > And 10^22 = 10^11*10^11 > > > If you know how big the original was you could round it to the correct > precision but that seems too much to hope for. > > print( round(1.6777215999999849e+29, digits=10) , digits=10) > #[1] 1.6777216e+29 > > identical( (1.6777216e+29)^(1/2) , floor( (1.6777216e+29)^(1/2) ) ) > #[1] TRUE > >> >> How can we overcome this problem? > > There are a couple of packages that support exact math on really large > numbers. You need to clarify what is being requested. You definitely need to > review R-FAQ 7.31 and make sure you understand it and also review ?double and > ?integer > > -- > > David Winsemius > Alameda, CA, USA > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. David Winsemius Alameda, CA, USA ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.