2012-03-10 4 views
0

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

+0

Какой язык вы используете? Это может быть полезно. – rcdmk

+0

Спасибо, что напомнил мне. Пожалуйста, используйте C. Спасибо. – user1128265

ответ

5

Простейшее путь в большинстве ситуаций, а языки, чтобы быть в

  • путем умножения на 16
  • округление до ближайшего целого числа
  • делят на 16.
+3

Даже более простой и часто лучший подход к этой проблеме - это определение блока, который должен быть 16x16, и все они работают в 16-м. –

+0

И так как 16 - это сила 2, точность не пострадает, если не произойдет переполнение. –

0

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

Смежные вопросы