[phobos] [Fwd: "Unsigned-related bugs never occur in real code."]
Don Clugston
dclugston at googlemail.com
Thu Jan 21 07:59:11 PST 2010
The problem is that this code passes:
void main()
{
float x = 0;
x += 2u - 5u;
assert(x == uint.max - 3);
}
But it's pretty unexpected and unhelpful behaviour.
It *doesn't* pass if you set: x = x + 2u - 5u. But x += y is
equivalent to: x = x + cast(typeof(x))y; and since there's an
explicit cast, no error message is generated.
2010/1/21 Sean Kelly <sean at invisibleduck.org>:
> 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
>
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
>
More information about the phobos
mailing list