Tamas, thank you!
Andrey
On Sunday, November 6, 2016 at 1:31:24 AM UTC+11, Tamas Papp wrote:
>
> myexpression{T <: Integer}(a::T) = myexpression(convert(Int128, a))
> # You can also define for BigInt, depending on the range you will need
> # for `a`. Order is important.
> myexpression(a::Int128) = a*((a+12)*(a+24)*(a+36)*(a+48))
>
> julia> myexpression(16140)
> 1103425489430061096960
>
> On Sat, Nov 05 2016, Andrey Stepnov wrote:
>
> > Hi Community!
> >
> > Suppose we have the following code:
> >
> > a = 1
> > y = 0
> > t = false
> >
> > while t == false
> > y = a*((a+12)*(a+24)*(a+36)*(a+48))
> > if mod(y,10^6) == 0
> > println(a)
> > println(y)
> > t = true
> > end
> > a += 1
> > end
> >
> > And the output will be:
> >
> > 16140
> > -3379154992512000000
> >
> > Actually it happens because we reached max positive Int64:
> >
> > julia> typemax(Int64)
> > 9223372036854775807
> >
> > julia> typemax(Int64) + 1
> > -9223372036854775808
> >
> > julia> bits(9223372036854775807)
> > "0111111111111111111111111111111111111111111111111111111111111111"
> >
> > julia> bits(-9223372036854775808)
> > "1000000000000000000000000000000000000000000000000000000000000000"
> >
> >
> > OK! Lets use Int128!
> >
> > julia> x = typemax(Int128)
> > 170141183460469231731687303715884105727
> >
> > julia> x::Int128 = a*((a+12)*(a+24)*(a+36)*(a+48))
> > -3037790465414534075
> >
> > julia> Int128(a*((a+12)*(a+24)*(a+36)*(a+48)))
> > -3037790465414534075
> >
> > julia> big(a*((a+12)*(a+24)*(a+36)*(a+48)))
> > -3037790465414534075
> >
> > julia> BigInt(a*((a+12)*(a+24)*(a+36)*(a+48)))
> > -3037790465414534075
> >
> > Not that we need, because `a` in a*((a+12)*(a+24)*(a+36)*(a+48)) has
> type
> > Int64! After convert `a` to Int128 - all fine:
> >
> > julia> a = convert(Int128,a)
> > 16141
> >
> > julia> typeof(a)
> > Int128
> >
> > julia> a*((a+12)*(a+24)*(a+36)*(a+48))
> > 1103766853957158562885
> >
> > julia> while t == false
> > y = a*((a+12)*(a+24)*(a+36)*(a+48))
> > if mod(y,10^6) == 0
> > println("a = $a")
> > println("y = $y")
> > t = true
> > end
> > a += 1
> > end
> > a = 62452
> > y = 951844491850031104000000
> >
> >
> > OK!
> >
> > But, is it possible to get result in Int128 even if `a` has Int64 type?
> >
> > For example, anybody can has a lot of code and not wants explicit define
> > type for a lot of variables for the good of single expression...
> >
> > Andrey Stepnov
>
>