Very strange problem with comparing floating point numbers

Ivan Agafonov armadil at yandex.ru
Sat Sep 29 18:29:48 PDT 2012


// Tell me about this sutation, may be it is a bug?

import std.math;
import std.stdio;

struct Vector(int size)
{
	union
	{
		float[size] array = 0;
		struct
		{
			static if (size == 2) float x, y;
			static if (size == 3) float x, y, z;
			static if (size == 4) float x, y, z, w;
		}
	}
	
	@property float lengthsqr()
	{
		static if (size == 2) return x*x + y*y;
		static if (size >= 3) return x*x + y*y + z*z;
	}

	@property float length() { return sqrt(lengthsqr()); }
	@property float length2() { float tmp = sqrt(lengthsqr()); 
return tmp; }
}

void main()
{
	auto a = Vector!4([1, 2, 3, 1]);
	auto a3 = Vector!3([1, 2, 3]);
	assert (a.lengthsqr == 14);
	
	auto alen = a.length; auto a3len = a3.length;
	
	// all of this prints the same number: 0x1.deea2p+1
	writefln("%a, %a", alen, a3len);
	writefln("%a, %a", a.length, a3.length);
	writefln("%a, %a", a.length2, a3.length2);
	
	// passes
	assert (alen == a3len);
	assert (a.length2 == a3.length2);
	assert (cast(real)a.length == cast(real)a3.length);
	
	// all of this fails!!!
	assert (a.length == a.length); // This is really shocking
	assert (a.length == a3.length);
}


More information about the Digitalmars-d-learn mailing list