Бросок к интервалу по сравнению с полом

Есть ли любое различие между ними:

float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);

Поскольку я понимаю, что оба случая имеют тот же результат. Есть ли какое-либо различие в скомпилированном коде?

108
задан Matt Ball 30 December 2014 в 21:44
поделиться

5 ответов

Преобразование в int будет усечено до нуля. floor () будет усечен до отрицательной бесконечности. Это даст вам другие значения, если полоса была отрицательной.

174
ответ дан 24 November 2019 в 03:31
поделиться

РЕДАКТИРОВАТЬ: поскольку вопрос мог быть изменен из-за путаницы между fabs () и floor () .

Учитывая исходные строки примера вопроса:

1.  float foo = (int)(bar / 3.0);

2.  float foo = fabs(bar / 3.0);

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

4
ответ дан 24 November 2019 в 03:31
поделиться

(int) x - это запрос на сохранение целой части x (здесь нет округления)

fabs (x) = | x | так что это > = 0 ;

Пример: (int) -3,5 возвращает -3 ; fabs (-3,5) возвращает 3,5 ;

В целом, fabs (x)> = x для всех x;

x> = (int) x if x> = 0

x <(int) x if x <0

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

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

3
ответ дан 24 November 2019 в 03:31
поделиться

SO 101, не меняйте свой вопрос после того, как люди ответят на ваш вопрос, вместо этого напишите новый вопрос.

Как вы думаете, почему у них будет такой же результат?

float foo = (int)(bar / 3.0) //will create an integer then assign it to a float

float foo = fabs(bar / 3.0 ) //will do the absolute value of a float division

bar = 1.0

foo1 = 0;
foo2 = 0.33333...
9
ответ дан 24 November 2019 в 03:31
поделиться