[phobos] Rational for review
David Simcha
dsimcha at gmail.com
Sat Aug 28 15:40:16 PDT 2010
Yes please what? isAssignable? The whole module? I'm confused.
On 8/28/2010 6:07 PM, Andrei Alexandrescu wrote:
> Yes please.
>
> Sent by shouting through my showerhead.
>
> On Aug 28, 2010, at 4:22 PM, David Simcha <dsimcha at gmail.com> wrote:
>
>> On 8/28/2010 4:22 PM, Philippe Sigaud wrote:
>>>
>>> line 76: isAssignable would be a good addition to std.traits.
>>
>> Yeah, will do unless anyone has any objections.
>>
>>>
>>>
>>>>
>>>> Next, 1/0. OK, it's correctly dealt with (Integer Divide By Zero
>>>> Error)
>>>> But 0/1 botches. In fact, any rational that's zero creates a DBZ
>>>> error. r-= r, etc.
>>>> I guess it's a pb in simplify (454-455) or gcf (638), you should
>>>> test for a zero numerator or divisor
>>>
>>> I can't believe I forgot to test this edge case. Fixed by simply
>>> testing for zero as a special case in simplify().
>>>
>>> Put in some very basic unit tests :-) 0+0==0, 1-1==0, that kind of
>>> thing :)
>>
>> Did that already. They pass.
>>
>>>
>>>>
>>>> Now, for the code itself:
>>>> line 35: Maybe you should add %, %=, they are part of what I
>>>> consider 'integer like'. You use them in gcf anyway
>>>
>>> Good point. Done. Also added comparison.
>>>
>>> Man, integer-like is beginning to be quite big.
>>>
>>> What about adding ++ and -- ?
>>
>> I don't need/use them, so there's no real reason to require them.
>>
>>>
>>> Btw, I'm against putting ++ and -- in Rational, but please do add
>>> opUnary!"+", opUnary!"-".
>>
>> Will do, along with ^^. These were left out as oversights, not for
>> "good" reasons.
>>
>>>
>>>> * a fractional part function (ie 22/7 is ~3.14 -> 0.14) as a FP
>>>
>>> Ditto.
>>>
>>> Thinking about it some more, maybe the fractional part should return
>>> a typeof(this): 22/7 -> 1/7. Not a float.
>>
>> Yea, this makes more sense. If you want a float, you can always cast
>> it.
>>
>>>
>>>> * Accordingly, floor/ceil functions could be interesting, unless
>>>> you think the user should use std.math.floor(cast(real)rat), which
>>>> I could understand.
>>>
>>> Again, good idea. Using std.math sucks because a major point of
>>> Rational is that it's supposed to work with arbitrary precision, and
>>> reals aren't arbitrary precision.
>>>
>>>
>>> I could argue that floor or ceil are exactly when you get rid of
>>> this arbitrary precision, but to answer the question in your next
>>> post, I think these should be part of the rational module and be
>>> free functions: it makes the module self-supported. And having
>>> rational support in std math means it must in turn import the
>>> rational module. I'm against this.
>>>
>>> In any case, people will probably import both at the same time...
>>>
>>> I'm not clear on the subtle nuances between the integer part, the
>>> floor and the ceil for positive and negative Rationals, though.
>>>
>>> See std.math: ceil, floor, nearbyInt, round, trunc! Awww.
>>>
>>> The next question would be: what other free function? I'll add
>>> abs(), but not much more. Maybe pow or opBinary!"^^" ?
>>
>> opBinary!"^^": Yes. pow(): I don't see the point. Probably
>> everyone writing generic math code nowadays will use ^^ instead of
>> pow() because it's less typing and more readable. Then again, pow()
>> would be trivial to implement in terms of opBinary!"^^".
>>
>>> I wouldn't add any trigonometric function.
>>
>>> .
>>> sqrt is on the fence for me. Is there an algorithm to calculate the
>>> square root of a rational apart from the Babylonian method?
>>
>> I'm going to leave trig and sqrt out. To me, the point of rationals
>> is to allow calculations to be exact. Functions where the result can
>> be irrational don't make sense in this context. You'd be better off
>> just casting to real and then calling the std.math functions.
>>
>>>
>>>> ***
>>>> 2. I couldn't figure out how to handle the case of user-defined
>>>> fixed-width integer types in the decimal conversion (opCast)
>>>> function, so it just assumes non-builtin integer types are
>>>> arbitrary precision. The biggest problem is
>>>> lack of a way of introspecting whether the integer is fixed or
>>>> arbitrary width and what its fixed width might be if it is, in
>>>> fact, fixed. The secondary problem is that I
>>>> don't know of a good algorithm (though I'm sure I could find one if
>>>> I tried) for converting fixed-width integers to floating point
>>>> numbers in software. Arbitrary precision is much easier.
>>>> ***
>>>>
>>>> About converting fixed-width integer-like types, maybe these should
>>>> provide .min and .max properties?
>>>> That way you know the range of possible values and maybe it's then
>>>> possible to convert (I didn't think this through so I may be
>>>> completly mistaken)
>>>
>>> I think what I'm going to do here is just throw an exception iff the
>>> denominator has both the highest and lowest order bit set. This is
>>> enough of a corner case in that it will only happen close to the
>>> limit of the largest denominator value that can be represented that
>>> I don't consider it a major limitation. It's easily detectable
>>> because the numerator will never become bigger than the denominator
>>> by bit shifting iff either the numerator is zero or the denominator
>>> has its highest order bit set. If the denominator's lowest order
>>> bit isn't set then I can shift the denominator right to make it not
>>> have its highest order bit set.
>>>
>>> What's the pb with having a numerator bigger than the denominator?
>>> Sorry, I didn't read the conversion function carefully.
>>
>> The way the function works involves bit shifting the numerator left
>> until it's bigger than the denominator. If the denominator has its
>> highest order bit occupied, no amount of shifting will ever make the
>> numerator bigger.
>>>
>>> This code has been around in some form for almost a year. It's just
>>> that the proposal for a units library made me remember that I've
>>> been meaning to clean up all the bit rot, improve it and submit it
>>> for inclusion.
>>>
>>> Seeing that you have time, talent and energy, I'll order a
>>> BigDecimal module :-)
>>
>> I'd love one, but I haven't the slightest clue how to write one and
>> have several hacking projects that I need to finish/start before even
>> considering it.
>>
>> _______________________________________________
>> phobos mailing list
>> phobos at puremagic.com
>> http://lists.puremagic.com/mailman/listinfo/phobos
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
>
More information about the phobos
mailing list