C#中压缩函数的最快实现

时间:2010-06-16 07:45:20

标签: c# performance math hlsl

我想在C#中实现一个frac函数(就像hsl中的那个http://msdn.microsoft.com/en-us/library/bb509603%28VS.85%29.aspx)但是因为它适用于处理器密集型应用程序,所以我希望有最好的版本。我正在使用像

这样的东西
public float Frac(float value)
{
   return value - (float)Math.Truncate(value);
}

但是我遇到精度问题,例如2.6f它在单元测试中返回

预计:0.600000024f但是:0.599999905f

我知道我可以将值转换为十进制,然后在最后转换为float以获得正确的结果,如下所示:

public float Frac(float value)
{
   return (float)((decimal)value - Decimal.Truncate((decimal)value));
}

但我想知道是否有更好的方法而不诉诸小数......

2 个答案:

答案 0 :(得分:2)

float(System.Single的别名)仅精确到7位数。不管怎么说,你不应该使用相等来比较浮点值。您应该检查它们是否在可容忍的范围内 - 例如,预期值和实际值之间的差异不超过0.000001。

Assert.AreEqual(expected, actual, delta);

如果您改用double,则精确到15-16位。

答案 1 :(得分:0)

您将需要使用小数,如:

public decimal Frac(decimal value) { return value - Math.Truncate(value); }

所以,当你通过2.6米时,总是得到.6