On Tuesday, April 5, 2016 at 2:42:56 AM UTC-4, Tomas Lycken wrote:
>
> There are only 6 uses of // outside of rationals.jl in base (4 of those 
> are in mpfr.jl), compared to 187 uses of div, and 22 uses of ÷. (that’s 
> uses, not definitions, exports, documentation, although the ratios are very 
> similar).
> Looking at packages, it seems also that div is used frequently, and many 
> times more than // for rational numbers.
>
> I don’t think counting usages of // vs ÷ is necessarily fair, since I 
> think // is used less than it should be (for reasons I eventually 
> expanded into a section in the Julia style guide 
> <http://docs.julialang.org/en/release-0.4/manual/style-guide/#avoid-using-floats-for-numeric-literals-in-generic-code-when-possible>).
>  
> More fair would be to compare the number of usages of ÷ with the number 
> of usages of // *plus the number of float literals*. (The results might 
> be the same, though - I haven’t actually made the comparison).
>
I have nothing against using Rationals, and I agree, they should be used 
instead of fp literals (because those are always binary and usually inexact 
in Julia) in many cases, but that wasn't my point.  In retrospect (but 
nothing to be done now), I think it might have been better to use // for 
integer division, and maybe /// for Rationals, for two reasons, integer 
division is probably still going to be used more frequently than Rationals 
(if Rationals were needed so frequently, why don't any of the other 
languages have support for them, but all that I've used have an integer 
division operator), and secondly, to minimize confusion, as Python, Lua 
(and I believe some others) use // for integer division.
 

> But more to the point:
>
> That is your opinion, however a number of other people disagree.
>
> *Exactly.* People disagree on this, and there seems to be a shortage of 
> ASCII characters (or character sequences) for everyone to have it all. In 
> the table you posted a while ago, I notice that Julia is the *only* 
> language which has infix operators for both (int, int) -> float, (int, 
> int) -> int and (int, int) -> rational division. I’m not saying the 
> design of this is final (software design is never final for software 
> reasons - only for people reasons…) but to me it looks like Julia has 
> already hit a sweet spot in supporting as much as possible for as many 
> tastes as possible.
>
That chart shows that Julia is the *only* language that does not have a one 
or two *ASCII* character infix operator for integer division.
I imagine that it is probably one of the most used operators that doesn't 
have an ASCII sequence in Julia.
Unicode operators are a major pain to deal with, especially when you have 
to type them differently in Jabber, Google+, GitHub, Emacs, Atom, the Julia 
REPL, etc.  Solutions such as "just customize your editor" don't work well 
also when you are dealing with a number of developers, all working together 
in a team using julia.  That just multiplies the pain.

There are also problems with the way the conversions are handled, when you 
have Integer / Integer, in that data gets lost silently,
and no matter what the type of the integers happens to be, you end up with 
Float64.
After reading the part you added to the Style Guide, I now think that the 
best way of dealing with Integer / Integer in Julia would be
to return the same as //.  That would give an *exact* answer always, which 
could be later converted to whatever size float desired
(or to an integer, without losing information silently).

Here's some examples, which shows how Integer / Integer -> Float64 can 
introduce bugs silently, and why changing it to
/(x::Integer, y::Integer) = x//y
instead of the current:
/(x::Integer, y::Integer) = float(x)/float(y)
would be a very nice choice:

*julia> **1234567890123456789/2*

*6.172839450617284e17*

*julia> **1234567890123456789÷2*

*617283945061728394*

*julia> **Int64(1234567890123456789/2)*

*617283945061728384*

*julia> **Int64(1234567890123456789//2)*

*ERROR: InexactError()*

* [inlined code] from ./rational.jl:76*

* in Int64(::Rational{Int64}) at ./sysimg.jl:48*

* in eval(::Module, ::Any) at ./boot.jl:237*


*julia> **Int64(1234567890123456789/3)*

*411522630041152256*

*julia> **Int64(1234567890123456789÷3)*

*411522630041152263*

*julia> **Int64(1234567890123456789//3)*

*411522630041152263*

As you can see, the silent conversion to Float ends up giving incorrect 
answers.

> Note that what the author *really wants* is to get the i-th potion of an 
> array
>
> Tamas Papp already posted an idiomatic solution for this:
>
> Define 
>
> portion(i,n,m=100) = 1+div(i*m,n):div((i+1)*m,n)
>
> and use 
>
> a[portion(i,n)]
>
> // T
>
That would only help that one particular case, not the myriad other cases 
where div or \div<tab> are being used in Julia code already,
both in Base and many many packages (I've grepped through all of the 
packages in METADATA.jl - it's quite a lot).

That's why I'd still like to see *some* easy to type two character ASCII 
sequence for integer division (and I think others would also
prefer that to using \div<tab> (or whatever you have to do in your editor) 
or div(a, b) all the time).

 - Scott

On Tuesday, April 5, 2016 at 4:55:05 AM UTC+2, Scott Jones wrote:
>
>
>>
>> On Monday, April 4, 2016 at 7:27:40 AM UTC-4, Stefan Karpinski wrote:
>>>
>>> Number does not imply or assume commutativity. The Quaternions package 
>>> provides a Quaternion type which is a subtype of Number. Rational, however, 
>>> only allows integer numerators and denominators. Since integer 
>>> multiplication is commutative, rational multiplication is too. But I still 
>>> think it best to reserve \\ with an analogous meaning to //. There are 
>>> already two syntaxes for integer division, which is plenty.
>>>
>>
>> That is your opinion, however a number of other people disagree. Every 
>> other language I've dealt with has had a simple ASCII sequence for integer 
>> division, / (in C, C++, Java, Python2 with integer operands), \ (in Mumps & 
>> Caché Object Script), or // (Python and Lua).
>> (and no, typing \div<tab> in the REPL and something else in an editor [as 
>> well as having to customize one's editor] just to get a Unicode ÷ 
>> character, is not really that useful)
>>
>> About \\ in particular, that's fine then, probably better to reserve that 
>> for rationals.
>> To me, it does seem a bit strange though that // was picked for rationals 
>> in Julia, something sure to cause confusion for people coming from Python 
>> (which seems to be a large part of people moving to Julia) or Lua, when 
>> integer division is used so much more frequently than rational numbers.
>> There are only 6 uses of // outside of rationals.jl in base (4 of those 
>> are in mpfr.jl), compared to 187 uses of div, and 22 uses of ÷.  (that's 
>> uses, not definitions, exports, documentation, although the ratios are very 
>> similar).
>> Looking at packages, it seems also that div is used frequently, and many 
>> times more than // for rational numbers.
>>
>> What about a different two character ASCII sequence that is currently a 
>> syntax error?
>> I think /| could be used, and could be easily remembered as being integer 
>> division (unlike ÷), it could be described as doing a division / and 
>> cutting off the remainder |.
>>
> ​
>

Reply via email to