Хорошо, поэтому я провел несколько тестов, чтобы увидеть, какой метод был самым быстрым после прочтения ответа "dboarman". К сожалению, это кажется невозможным без каста с использованием строго c #, и самый быстрый метод - просто на месте, потому что я забочусь о скорости, так как в основном это для игр, которые будут придерживаться старого метода каста.
Эти тесты были скомпилированы с использованием следующих спецификаций ::
C# .NET 4.0
ConsoleApplication - Release - Optimized code - x64
4gb ram, 2.4ghz AMD_X2_DualCore 4600 CPU, running Windows7 Ultimate.
Код:
static void Main(string[] args)
{
//Start
Console.Write("Hit Enter to Start\n");
Console.ReadLine();
long num = 100;
long mil = 0;
float val = 0.01f;
Stopwatch startTime = new Stopwatch();
//Run
for(long i = 0; i != num; ++i)
{
startTime.Restart();
for(uint i2 = 0; i2 != 1000000; ++i2) val = (float)System.Math.Cos(val);// 48 Milliseconds
//for(uint i2 = 0; i2 != 1000000; ++i2) val = System.Math.Cos(val).ToFloat();// 53 Milliseconds
//for(uint i2 = 0; i2 != 1000000; ++i2) val = MathF2.Cos(val);// 59 Milliseconds
//for(uint i2 = 0; i2 != 1000000; ++i2) val = MathF.Cos(val);// 63 Milliseconds
startTime.Stop();
mil += startTime.ElapsedMilliseconds;
}
//End
mil /= num;
//Print
Console.Write("Milliseconds = "+mil.ToString());
Console.ReadLine();
}
Вот базовый математический код для тестов ::
public static class MathF
{
public static Func<double, float> Cos = angleR => (float)System.Math.Cos(angleR);
public static Func<double, float> Sin = angleR => (float)System.Math.Sin(angleR);
}
public static class MathF2
{
public static float Cos(float pValue) {return (float)System.Math.Cos(pValue);}
}
public static class MathExtensions
{
public static float ToFloat(this double value)
{
return (float)value;
}
}