Задать вопрос
@SergeySerge11

Какая точность у float чисел IEEE754? Значение какое, число какое, без текста?

float k = 500f;
                float k2 =k- 1e-5f; // 0.00001F
                Console.WriteLine(k);
                Console.WriteLine(k2);
                Console.WriteLine(k2==k); // TRUE

Почему вычитание не сработало?
При этом в интерактивном окне, там false показывает.

Мантиса 23 бита имеет, значит число наверное 8 млн, почему тогда 10к значное значение с ошибкой выходит.
Я вообще не понимаю как исправить алгоритм что бы он работал.
Как получить 499.999999 ? Отнимать 1e-4f? А гарантия есть что при других значениях все корректно будет. Почему в документации ни где не найти КАКОЕ это число, пишут 6 знаков, но вот 5 и не работает, обычно в 100% всех кодов при сравнение 2 float, есть такое
float epsilon=1-e5;
   if(MathF.Abs(a-b)<epsilon){  }

Но вот в примере выше этот код, который присутствует в 1000000000000% всех тестов, всех учебниках, всех кодах не работает.
В добавок диапазон значений в задаче может быть от 0-1, и 0.0001 может быть выше некоторого шага, поэтому мне точно нужно минимум 0. 0 0 0 0 1 знач отнимать.
  • Вопрос задан
  • 58 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У 32-битового вещественного числа в IEEE754 точность ~7 десятичных разрядов. То есть, для числа 500 это будет 499.9999 и 500.0001.
Значение ε при сравнении вещественных надо вычислять исходя из значений самих чисел. Примерно так:
bool function isEqual(float a, float b) {
    float eps = 1e-6 * max(fabs(a), fabs(b));
    return fabs(a - b) < eps;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы