Фиксированая точка

Страницы работы

Содержание работы

Fixed Points - Фиксированая точка

Fixed points are often used to speed up code, but also to make code more organized. By using Fixed Points instead of floats, you can get rid of non portable pointer convertions and you can use your values as 4, 8, 16 or any bits value. This is something that cannot be done with floats and its darn slow anyway to convert floats to another kind of variable, because of its contruction. Anyway, lets see how fixed points works. Basicly fixed points is just a number multiplied with another. To make an example, lets take a random floating point number. Lets make it the number 1554.132473. Now, all we gotta do is to make this number fit into a 32 bit variable. We can do this by multiplying the number by, say 65536. This is also the same as Shift Left 16, which is faster than a normal multiply, and therefore we will use this. Now, lets take a look at how this looks in bits. We choose another number this time, lets say the number one:

Числа с фиксированной десятичной точкой (ЧФДТ) часто используются, чтобы ускорить код, но также и делать код более организованным. Используя ЧФДТ вместо плавающей, Вы можете избавляться от не переносного указателя конверсий, и Вы можете использовать ваши значения как 4, 8, 16 или любые значения бит. Это - кое-что, что не может быть выполнено с плавающей и это делает медленным во всяком случае, чтобы преобразовать плавающие к другому виду переменной, из-за сжатия. Во всяком случае, давайте посмотрим как ЧФДТ работают. Простейше ЧФДТ - только число умноженное на другое число. Сделаем пример, допустим, возьмем произвольное число с плавающей запятой. Допустим возьмем число 1554.132473. Теперь, все мы, хотим делать так это число поместить в 32 разрядную переменную. Мы можем делать это,  умножая число на, скажем 65536. Это - тоже самое что сдвиг влево на 16, который является быстрее чем нормальное умножение, и следовательно мы используем это. Теперь, давайте возьмем и посмотрим на это, как это смотрит в битах. Мы выбираем другое число в это время, давайте скажем номер один:

byte 1   byte 2   byte 3   byte 4

00000000 00000000 00000000 00000001   =   1

Now, by Shifting Left sixteen times we get the number:

Теперь, сместим влево на шестнадцать раз и мы получим число:

byte 1   byte 2   byte 3   byte 4

00000000 00000001 00000000 00000000   =   65536

This way, the number one equals 65536 in fixed points. Therefore, every number below 65536 would be decimal points. Now we have a 16.16 bit number. But theres no advantage without a disadvantage. Now, lets for an example take the number 1554.132473 which was mentioned before. if we multiply this by 65536 we will get the number 101851625.8. This can ofcourse not be in a fixed 16.16 number, since it uses decimal points. Therfore we will have to cut the last .8 but how much will this change the actual number? Lets try to divide the number by 65536 to get the real number back again. This should result in the number 1554.132461 which means we have lost 0.000012. Not much and it cannot change much since its rather hard plotting 0.00012 of a pixel. In things like texturemapping this could have an effect if the texture was big enough, and if one found it an error that the map has one extra pixel after approx 10000 pixels of map. This would anyway, require a huge screen resolution. Maybe that disadvantage wasn't so big afterall, but if you use things like detecting when an object was touching another or wanted to morph, this could have a destructive result if it wasn't coded correct. Another thing which might could get annoying, is that you cannot have any value above 65536 since 16 shift left's would push some of the bits of the cliff.

Этим способом, число один равняется 65536 в ЧФДТ. Следовательно, каждое число меньше 65536 был бы за десятичной запятой. Теперь мы имеем два 16.16 разрядных числа. Но не дает никакого преимущество без недостатка. Теперь, допускаем для примера, число 1554.132473, которое было упомянуто прежде. Если мы умножаем это на 65536, мы получим число 101851625.8. Это может конечно не находиться в фиксированном 16.16 числе, так как это использует десятичные запятые. Таким образом мы будем должны усечь последнию 8, но сколько этого изменит фактическое число? Допускает испытание, чтобы делить число на 65536, чтобы получить вещественное число обратно. Это должно привести к числу1554.132461, которое означает, что мы потеряли 0.000012. Немного и это не может изменить много поскольку это трудно отрисовать 0.00012 пиксела. В предметах подобно наложение тестуры это могло бы иметь негативное воздействие, если текстура была большая достаточна, и если один находят это погрешность, что отображение имеет один дополнительный пиксел после приблизительно на 10000 пикселами отображения. Это было бы во всяком случае, но требует огромного разрешения экрана. Возможно тот недостаток не был таким большим, но если Вы используете вещи подобно обнаружению столкновений, когда объект затрагивает другой или делаете морфинг, это могло бы иметь разрушительный результат, если это не было кодировано правильно. Другая вещь, которая мог бы могла бы быть раздражающая - то, что Вы не можете иметь любое значение более чем 65536, так как после 16 сдвигов влево часть битов столкнулись бы с утеса.

Информация о работе