Сравнение значений с плавающей запятой в C - PullRequest
0 голосов
/ 13 октября 2011

Я хочу сравнить значения с плавающей точкой, чтобы определить наибольшее число в списке. Точность с плавающей точкой фиксирована, 6 после десятичной дроби.

Стоит ли сравнивать их как целые числа, и если они равныпойти и выкопать значения после десятичной дроби?

Ответы [ 6 ]

2 голосов
/ 13 октября 2011

Самый простой способ сравнить числа с плавающей запятой - это оператор <, например,

if(float1 < float2)
     printf("%f < %f\n", float1, float2);
1 голос
/ 13 октября 2011

используйте DBL_EPSILON в качестве основы для определения того, насколько близко должно быть двойное значение.

используйте FLT_EPSILON для чисел с плавающей запятой.

см. этот ответ для примера функции, демонстрирующейтехника.

0 голосов
/ 15 апреля 2014

В следующей статье представлены различные альтернативы для сравнения значений с плавающей запятой. http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

Обычно, поиск разницы между поплавками и проверка, находится ли разница в пределах точности, помогает в сравнении поплавков.Но, как уже упоминалось, не существует идеального ответа и реализации для этого, потому что различия между соседними поплавками варьируются в зависимости от величины.Следовательно, если вы знаете диапазон значений, который будет использовать ваша программа, тогда вы можете выбрать соответствующую реализацию для сравнения.

0 голосов
/ 13 октября 2011

Код для этого выглядит следующим образом:

float MinFloatArray(float *a, int n)
{
    int i;
    float result = MAX_FLOAT;
    for (i=0; i<n; i++)
        if (a[i]<result)
            result = a[i];
    return result;
}
0 голосов
/ 13 октября 2011

Если вы хотите найти наибольшее число, зачем вам беспокоиться о сравнении на равенство?

0 голосов
/ 13 октября 2011

Это зависит от того, что вы нам не говорите.

  • Как вам предоставляются эти цифры?Как строки, или они уже находятся в памяти (массив с плавающей запятой / двойной массив)?
  • Насколько они велики?Есть ли какая-то самая большая граница, чтобы иметь определенную точность?То есть, имеют ли значение 6 десятичных знаков, если число, скажем, 100 миллионов?
  • Можно ли потерять точность?иметь значения в массиве с плавающей точкой, я бы сделал следующее:
    float biggest(float * values, int num)
    {
        int i;
        float curmax;
        if (num == 0) return NAN;
        curmax = values[0];
        for (i=1; i < num; i++) {
            if (values[i] > curmax) curmax = values[i];
        }
        return curmax;
    }
    
...