Вопрос

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

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

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

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

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

delay=(int)(64*(floatDelay - intDelay) + 0.5))
Это было полезно?

Решение

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

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

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

Другие советы

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

Принимая во внимание функцию округления, ваши намерения ясны.

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

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

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

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

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

Это действительно правда?

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

Я имею в виду:4,9999+0,5=5,4999 -> 5

/Йохан

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top