text: ///////////////////////////////////////////////////////////////////////////////////////////////////
  // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
  ///////////////////////////////////////////////////////////////////////////////////////////////////
  // Created : 2011-04-26
  // Updated : 2011-04-26
  // Licence : This source is under MIT licence
  // File    : test/gtx/ulp.cpp
  ///////////////////////////////////////////////////////////////////////////////////////////////////
  
  #include <glm/glm.hpp>
  #include <glm/gtx/ulp.hpp>
  #include <iostream>
  #include <limits>
  
  int test_ulp_float_dist()
  {
  	int Error = 0;
  
  	float A = 1.0f;
  
      float B = glm::next_float(A);
  	Error += A != B ? 0 : 1;
  	float C = glm::prev_float(B);
  	Error += A == C ? 0 : 1;
  
  	int D = glm::float_distance(A, B);
  	Error += D == 1 ? 0 : 1;
  	int E = glm::float_distance(A, C);
  	Error += E == 0 ? 0 : 1;
  
  	return Error;
  }
  
  int test_ulp_float_step()
  {
  	int Error = 0;
  
  	float A = 1.0f;
  
  	for(int i = 10; i < 1000; i *= 10)
  	{
  		float B = glm::next_float(A, i);
  		Error += A != B ? 0 : 1;
  		float C = glm::prev_float(B, i);
  		Error += A == C ? 0 : 1;
  
  		int D = glm::float_distance(A, B);
  		Error += D == i ? 0 : 1;
  		int E = glm::float_distance(A, C);
  		Error += E == 0 ? 0 : 1;
  	}
  
  	return Error;
  }
  
  int test_ulp_double_dist()
  {
  	int Error = 0;
  
  	double A = 1.0;
  
      double B = glm::next_float(A);
  	Error += A != B ? 0 : 1;
  	double C = glm::prev_float(B);
  	Error += A == C ? 0 : 1;
  
  	int D = glm::float_distance(A, B);
  	Error += D == 1 ? 0 : 1;
  	int E = glm::float_distance(A, C);
  	Error += E == 0 ? 0 : 1;
  
  	return Error;
  }
  
  int test_ulp_double_step()
  {
  	int Error = 0;
  
  	double A = 1.0;
  
  	for(int i = 10; i < 1000; i *= 10)
  	{
  		double B = glm::next_float(A, i);
  		Error += A != B ? 0 : 1;
  		double C = glm::prev_float(B, i);
  		Error += A == C ? 0 : 1;
  
  		int D = glm::float_distance(A, B);
  		Error += D == i ? 0 : 1;
  		int E = glm::float_distance(A, C);
  		Error += E == 0 ? 0 : 1;
  	}
  
  	return Error;
  }
  
  int main()
  {
  	int Error = 0;
  	Error += test_ulp_float_dist();
  	Error += test_ulp_float_step();
  	Error += test_ulp_double_dist();
  	Error += test_ulp_double_step();
  	return Error;
  }
  
  
  