Можно ли сравнить и добавить число с плавающей запятой в целое число в C?

Можно ли сравнить число с плавающей запятой с целым числом?

Будет ли поплавок сравниваться с целыми числами в коде?

float f;     // f has a saved predetermined floating-point value to it  
if (f >=100){__asm__reset...etc}

Кроме того, могу ли я...

float f;
int x = 100;
x+=f;

Мне нужно использовать значение с плавающей запятой f, полученное из системы опорных координат, для настройки значения позиции x, которое управляет сигналом ШИМ для коррекции отношения.

Ответ 1

Первый будет работать нормально. 100 будет преобразован в float, а IEE754 может представлять все целые числа точно так же, как float, до около 2 23.

Второй будет работать, но сначала будет преобразован в целое число, поэтому вы потеряете точность (что неизбежно, если вы превращаете float в целые числа).

Ответ 2

Поскольку вы идентифицировали себя как незнакомого с тонкостями чисел с плавающей запятой, я отсылаю вас к этой тонкой статье Дэвида Голдберга: Что каждый компьютер Ученый должен знать о арифметике с плавающей точкой (перепечатка на Sun).

После того как вы испугались этого, реальность такова, что большая часть времени с плавающей запятой является огромным благом для проведения расчетов. И современные компиляторы и языки (включая C) обрабатывают конверсии разумно, так что вам не нужно беспокоиться о них. Если вы этого не сделаете.

Точки, поднятые о точности, безусловно, действительны. IEEE float эффективно имеет только 24 бит точности, что меньше 32-битного целого. Использование double для промежуточных вычислений приведет к возврату всех округлений и точности к преобразованию обратно в float или int.

Ответ 3

Арифметика смешанного режима (арифметика между операндами разных типов и/или размеров) является законной, но хрупкой. Стандарт C определяет правила для продвижения типов, чтобы преобразовать операнды в общее представление. Автоматическое продвижение по типу позволяет компилятору делать что-то разумное для операций смешанного режима, но "разумный" не обязательно означает "правильный".

Чтобы действительно знать, правильно ли поведение, вы должны сначала понять правила продвижения, а затем понять представление типов данных. В общих чертах:

  • более короткие типы преобразуются в более длинные типы (от float до double, short до int и т.д.)
  • целые типы преобразуются в типы с плавающей точкой
  • подписанные/неподписанные конверсии позволяют избежать потери данных (независимо от того, подписан ли подписан без знака или наоборот зависит от размера соответствующих типов)

Является ли код типа x > y (где x и y имеют разные типы) правильным или неправильным, зависит от значений, которые могут выполняться x и y. По моему опыту, распространенная практика запрещает (через стандарт кодирования) неявное преобразование типов. Программист должен учитывать контекст и явно выполнять любые преобразования типов.

Ответ 4

Можно ли сравнить float и integer, конечно. Но проблема, с которой вы столкнетесь, - это точность. В большинстве реализаций C/С++ float и int имеют одинаковый размер (4 байта) и совершенно разные уровни точности. Ни один из типов не может содержать все значения другого типа. Поскольку один тип не может быть преобразован в другой тип без потери точности, и типы не могут быть сопоставимыми по природе, сравнение без рассмотрения другого типа приведет к потере точности в некоторых сценариях.

Что вы можете сделать, чтобы избежать потери точности, является преобразование обоих типов в тип, который имеет достаточную точность для представления всех значений float и int. В большинстве системах double сделает именно это. Таким образом, обычно выполняется сравнение без потерь

float f = getSomeFloat();
int i = getSomeInt();
if ( (double)i == (double)f ) { 
   ...
}

Ответ 5

LHS определяет точность, Поэтому, если ваш LHS - int, а RHS - float, это приводит к потере точности.

Также рассмотрите связанный с FP CFAQ

Ответ 6

Да, вы можете сравнить их, вы можете сделать математику на них без особого уважения, что в большинстве случаев. Но только большинство. Большой bugaboo - это то, что вы можете проверить f<i и т.д., Но не должны проверять f==i. Целое число и float, которые должны быть одинаковыми по значению, необязательно идентичны.

Ответ 7

Да, все будет хорошо. В частности, int будет преобразован в float для целей преобразования. Во втором вам нужно будет сбрасывать int, но в противном случае это должно быть хорошо.

Ответ 8

Да, и иногда он будет делать именно то, что вы ожидаете.

Как указывали другие, сравнивается, например, 1.0 == 1, потому что целое число 1 является типом, отличным от double (не float) перед сравнением.

Однако другие сравнения могут не совпадать.

Ответ 9

О том, что обозначение 1.0 имеет тип double, поэтому сравнение производится в правилах продвижения по типу по типу, как указано ранее. 1.f или 1.0f имеет тип float, и сравнение было бы сделано в float. И это сработало бы, так как мы сказали, что 2 ^ 23 первых целых числа представляются в поплавке.