[Issue 3928] New: Comparing imaginaries with reals produces results that are inconsistent
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Wed Mar 10 12:04:37 PST 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3928
Summary: Comparing imaginaries with reals produces results that
are inconsistent
Product: D
Version: 2.041
Platform: x86
OS/Version: Windows
Status: NEW
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: crimson.magus at gmail.com
--- Comment #0 from Aldo Nunez <crimson.magus at gmail.com> 2010-03-10 12:04:36 PST ---
Comparing an imaginary number like an ifloat with a real one like a float:
1. Has results that differ at compile time and runtime.
2. At runtime is done in the wrong order.
3. Doesn't seem to be very meaningful, given that you can't compare complex
numbers.
With respect to each issue above, here are some more details.
1. Different results at runtime and compile time.
At compile time, if the left is imaginary, then we take the imaginary part of
the right side and compare the two. If the left side is real, then we take the
real part of the right side and compare.
All of this is as seen in constfold.c.
At runtime, we turn both sides into complex numbers by making a missing part
zero. Then, we compare the imaginary parts, and if they're equal, compare the
real parts.
2. Wrong order at runtime.
In the runtime comparison described in #1 what's actually compared is right to
left instead of left to right. If my program has "a < b", then "b < a" is
checked.
3. Meaning?
Comparisons where at least one side is a complex number are not allowed in D.
As such, is it meaningful to allow the comparisons described here, given that
such numbers are treated as complex numbers and compared?
Note, all of this is strictly where one side of a compare expression is an
imaginary number and the other is a real number.
Here's a sample program:
import std.stdio;
void main()
{
cfloat cf1 = 1 + 2i;
cfloat cf2 = 3 + 4i;
ifloat if2 = 1i;
float f2 = 3;
ifloat if3 = 4i;
float f3 = 2;
ifloat if4 = 5i;
float f4 = 5;
writeln( "--- < ---" );
writeln( if2 < f2 );
writeln( f2 < if2 );
writeln( if3 < f3 );
writeln( f3 < if3 );
writeln( if4 < f4 );
writeln( f4 < if4 );
writeln( 1i < 3 );
writeln( 3 < 1i );
writeln( 4i < 2 );
writeln( 2 < 4i );
writeln( 5i < 5 );
writeln( 5 < 5i );
writeln( "--- == ---" );
writeln( if2 == f2 );
writeln( f2 == if2 );
writeln( if3 == f3 );
writeln( f3 == if3 );
writeln( if4 == f4 );
writeln( f4 == if4 );
writeln( 1i == 3 );
writeln( 3 == 1i );
writeln( 4i == 2 );
writeln( 2 == 4i );
writeln( 5i == 5 );
writeln( 5 == 5i );
writeln( "--- > ---" );
writeln( if2 > f2 );
writeln( f2 > if2 );
writeln( if3 > f3 );
writeln( f3 > if3 );
writeln( if4 > f4 );
writeln( f4 > if4 );
writeln( 1i > 3 );
writeln( 3 > 1i );
writeln( 4i > 2 );
writeln( 2 > 4i );
writeln( 5i > 5 );
writeln( 5 > 5i );
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list