Severe loss of precision with random integers


#include <stdint.h>
#include <limits.h>
#include <iostream>

template <typename T1, typename T2> inline size_t const find_numerical_errors(T2 const min, T2 const max)
{
	size_t error_count = 0;

	for (volatile T2 i = min; i < max; ++i) 
		if ((T2)((T1)i) != i)
			++error_count; 

	return error_count;
}

int main()
{
	std::cout << "float/int32_t errors: " << find_numerical_errors<float, int32_t>(INT_MIN, INT_MAX) << std::endl;
	std::cout << "float/uint32_t errors: " << find_numerical_errors<float, uint32_t>(0, UINT_MAX) << std::endl; 

	std::cout << "double/int32_t errors: " << find_numerical_errors<double, int32_t>(INT_MIN, INT_MAX) << std::endl;
	std::cout << "double/uint32_t errors: " << find_numerical_errors<double, uint32_t>(0, UINT_MAX) << std::endl; 

	char wait;
	std::cin >> wait;

	return 0;
}

float/int32_t errors: 4143972351
float/uint32_t errors: 4211081215

double/int32_t errors: 0
double/uint32_t errors: 0