округление до ближайшей 1/16 и усечение до ближайшей 1/16 значения в C - PullRequest
0 голосов
/ 10 марта 2012

Предположим, размер блока равен 1X1, и я должен двигаться с шагом 1/16 вдоль направления x и y.Я хочу округлить 0,53124 до ближайшей 1/16 размера блока, который равен 0,5625.И аналогичным образом я хочу укоротить 0,53124 до ближайшей 1/16 размера блока, который равен 0,5.Есть ли эффективный способ сделать это?Пожалуйста, дайте мне знать.

Ответы [ 2 ]

5 голосов
/ 10 марта 2012

Самый простой способ в большинстве ситуаций и языков - это

  • умножить на 16
  • округлить до ближайшего целого числа
  • разделить на 16.
0 голосов
/ 11 марта 2012

Поскольку вы, похоже, хотите фиксированную точку , я бы просто использовал фиксированную точку (целые числа в единицах 1/16), если это возможно.Но если вам действительно нужно смешивать операции с плавающей запятой и округление, один из способов - смещение всех ваших значений на огромное число, такое, что место 1/16 является последним.К сожалению, при использовании gcc у этого подхода могут возникнуть проблемы в таких системах, как i387, где выражения с плавающей запятой вычисляются с повышенной точностью, если вы не используете везде long double, поэтому с практической точки зрения ответ Иоахима может быть проще сделать надежным (хотяэто, вероятно, работает намного хуже).

...