Самая быстрая реализация функции ГРП в C # - PullRequest
2 голосов
/ 16 июня 2010

Я хотел бы реализовать функцию frac в C # (точно так же, как здесь, в 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

Я знаю, что могу преобразовать в десятичное значение, а затем в конце преобразовать в число с плавающей точкой, чтобы получить правильный результат примерно так:

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

Но мне интересно, есть ли лучший способ, не прибегая к десятичным дробям ...

Ответы [ 2 ]

2 голосов
/ 16 июня 2010

float (псевдоним для System.Single) с точностью до 7 цифр.Вы все равно не должны сравнивать значения с плавающей точкой, используя равенство.Вместо этого вы должны проверить, что они находятся в допустимом диапазоне - например, что разница между ожидаемыми и фактическими значениями не превышает 0,000001.

Assert.AreEqual(expected, actual, delta);

Если вместо этого вы используете double ,Вы будете с точностью до 15-16 цифр.

0 голосов
/ 16 июня 2010

Вам нужно использовать десятичные дроби, как в:

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

Итак, когда вы пройдете 2,6 м, вы будете всегда получать 0,6

...