[phobos] [Fwd: "Unsigned-related bugs never occur in real code."]

Sean Kelly sean at invisibleduck.org
Thu Jan 21 06:41:00 PST 2010


I got a reasonable answer by casting to int before calling abs():

import std.math, std.stdio;

void main() {
   auto a = [ 4, 4, 2, 3, 2 ];
   float avgdist = 0;
   uint count;

   foreach (i, e1; a) {
       foreach (j, e2; a) {
           if (i == j) continue;
           if (e1 != e2) continue;
           ++count;
           writeln("adding ", cast(int)(i - j));
           avgdist += abs(cast(int)(i - j));
       }
   }

   writeln(count, " ", avgdist / count);
}

On Jan 21, 2010, at 12:41 AM, Andrei Alexandrescu wrote:

> The problem persists even if I remove the call to abs(). At least its removal makes things look more suspicious.
> 
> Andrei
> 
> Don Clugston wrote:
>> 2010/1/21 Sean Kelly <sean at invisibleduck.org>:
>>> My first inclination would be for abs to only accept signed values.  Unsigned values don't really seem appropriate for unchecked math operations.
>> I agree, it doesn't make sense to take the absolute value of something
>> which doesn't have a sign. With range checking, it ought to be
>> possible to implicitly cast from uint to int, which would allow all of
>> the sensible uses. Unfortunately, implicit casting and templates don't
>> interact well. So I think abs() might need to go back to being a
>> non-template function.
>>> On Jan 20, 2010, at 8:50 PM, Andrei Alexandrescu wrote:
>>> 
>>>> Is there anything we can do about this?
>>>> 
>>>> Andrei
>>>> 
>>>> -------- Original Message --------
>>>> Subject: "Unsigned-related bugs never occur in real code."
>>>> Date: Wed, 20 Jan 2010 20:42:50 -0800
>>>> From: Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org>
>>>> Organization: Digital Mars
>>>> Newsgroups: digitalmars.D
>>>> 
>>>> "It's an academic problem. Don't worry about it and move on."
>>>> 
>>>> That's what Walter kept on telling me. Yet I've spent the better part of
>>>> an hour reducing a bug down to the following:
>>>> 
>>>> import std.math, std.stdio;
>>>> 
>>>> void main() {
>>>>   auto a = [ 4, 4, 2, 3, 2 ];
>>>>   float avgdist = 0;
>>>>   uint count;
>>>> 
>>>>   foreach (i, e1; a) {
>>>>       foreach (j, e2; a) {
>>>>           if (i == j) continue;
>>>>           if (e1 != e2) continue;
>>>>           ++count;
>>>>           avgdist += abs(i - j);
>>>>       }
>>>>   }
>>>> 
>>>>   writeln(count, " ", avgdist / count);
>>>> }
>>>> 
>>>> May this post be an innocent victim of the war against unsigned-related
>>>> bugs.
>>>> 
>>>> 
>>>> Andrei
>>>> _______________________________________________
>>>> 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
>>> 
>> _______________________________________________
>> 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