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

должен предшествовать код, который стремится запустить по ошибке. В вашем конкретном случае просто переместите обработку исключений сразу после «from», например:


      
        
        
          org.savino.hb.dataprovider.DataProviderException
            
                true
            
             
        
        
        
        
        
        
    

Возможной (более естественной) альтернативой является try-catch: http: // people. apache.org/~dkulp/camel/try-catch-finally.html

19
задан Ciro Santilli 新疆改造中心法轮功六四事件 15 June 2015 в 15:58
поделиться

8 ответов

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

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

21
ответ дан 30 November 2019 в 03:08
поделиться

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

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

Поднятые вопросы о точности, безусловно, верны. IEEE float эффективно имеет точность только 24 бита, что меньше 32-битного целого числа.

10
ответ дан 30 November 2019 в 03:08
поделиться

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

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

  • более короткие типы преобразуются в более длинные типы ( float в double , short в int и т. Д. без знака или наоборот зависит от размера соответствующих типов)

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

8
ответ дан 30 November 2019 в 03:08
поделиться

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

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

float f = getSomeFloat();
int i = getSomeInt();
if ( (double)i == (double)f ) { 
   ...
}
2
ответ дан 30 November 2019 в 03:08
поделиться

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

Также взгляните на связанный с FP CFAQ

1
ответ дан 30 November 2019 в 03:08
поделиться

Да, вы можете сравнивать их, вы можете делать с ними математику, не особенно заботясь о том, что в большинстве случаев. Но только большинство. Большая ошибка заключается в том, что вы можете проверить f и т. Д., Но не следует проверять f == i . Целое число и число с плавающей точкой, которые «должны» быть одинаковыми по значению, не обязательно идентичны.

1
ответ дан 30 November 2019 в 03:08
поделиться

Yeah, it'll work fine. Specifically, the int will be converted to float for the purposes of the conversion. In the second one you'll need to cast to int but it should be fine otherwise.

0
ответ дан 30 November 2019 в 03:08
поделиться

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

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

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

0
ответ дан 30 November 2019 в 03:08
поделиться
Другие вопросы по тегам:

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