[R] Determinant
David Winsemius
dwinsemius at comcast.net
Thu May 14 22:26:59 CEST 2015
On May 14, 2015, at 12:50 PM, David Winsemius wrote:
>
> On May 14, 2015, at 1:44 AM, chasiotisv at 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 at 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
More information about the R-help
mailing list