ярлыки округления в C - PullRequest
       7

ярлыки округления в C

2 голосов
/ 07 января 2009

Я работаю в C для реализации псевдокода, который говорит:

delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay

floatDelay всегда будет положительным. Есть ли преимущество в использовании функции округления из math.h:

#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));

или я могу использовать:

delay=(int)(64*(floatDelay - intDelay) + 0.5))

Ответы [ 5 ]

3 голосов
/ 07 января 2009

Нет никаких преимуществ, о которых я знаю, кроме того факта, что приведение к int может быть не сразу очевидно для других программистов, что оно работает как усечение ...

В то время как с функцией округления ваши намерения ясны.

2 голосов
/ 07 января 2009

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

Например, 5f может быть приблизительно равен 4.9999999 ... и если вы попытаетесь привести непосредственно к int, оно будет усечено до 4.

Чтобы понять почему, вам следует поискать числа с плавающей точкой в ​​Википедии. Короче говоря, вместо того, чтобы хранить число в виде прямой последовательности битов типа int, оно хранится в двух частях. Есть «дробь» и показатель степени, где конечное значение с плавающей запятой - это дробь * (база ^ экспонента).

2 голосов
/ 07 января 2009

Либо в порядке, если вы говорите, floatDelay является положительным.

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

0 голосов
/ 08 января 2009

Например, 5f может быть приближен к 4.9999999 ... и если вы попытаетесь привести непосредственно к int, оно будет усечено до 4.

Это правда?

Если вы убедитесь, что добавляете 0,5 перед усечением до int,
действительно 4.9999 проблема.

Я имею в виду: 4.9999 + 0.5 = 5.4999 -> 5

/ Johan

0 голосов
/ 08 января 2009

Я нашел " Усечение десятичного значения в c ++ ", при условии полезного обсуждения чисел с плавающей запятой.

В частности, Грег Хьюгилл предоставил эту ссылку: Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой Дэвид Голдберг

...