Доброго времени суток Я с другом делаю трехмерный движок, на текущий момент софтварный, мы используем арифметику с плавающей запятой (fpu, сопроцессор по-нашему). Есть ли смысл переходить на целочисленную арифметику? Будет ли прирост в производительности от этого?
ИМХО смысла переходить к целым числам нету. Ведь неспроста все графичиские апишки юзают дробную арифметику. Ощутимого прироста в производительности скорее всего не будет(а откуда ему взяться), а вот универсальность потеряется.
имею опыт рисования синусоиды. из-за того что я пропускал занятия по паскалю, я не знал как из float получить int, а домашнее задание было ее нарисовать. сбацал табличным методом. зато у других прорисовало по пол-часа при изменении коэффициентов, а у меня растягивалась/сжималась в режиме реального времени - препадша обалдела 8) а всего-то: таблица синусов от 0 до 90, умноженных на 32768, с дискретностью 1 градус. делил на 32768 я естественно сдвигом на 1
да, кстати, только что попробовал - чтобы работало нужно рид-онли с файлов сбросить (архивировал с компакта)
shoo А у меня в свое время небыло даже таблички синусов. Пришлось алгоритм придумывать, что впрочем времени много не заняло. Алгоритм получился любопытный - через деление пополам, но и его пришлось оптимизировать с помощью таблички. На входе подавалось 16-битное число (т.е. от 32767 до 32768), на выходе получалось значение его синуса (float 80-битное). Старшие два бита параметра при этом идентифицировали "четверть" окружности, а оставшиеся 14 делили эту четверть на 16384 секторов. Алгоритм: В начале беруться две точки A и B, приходящиеся соответственно на Pi/2 и 0 радиан, на окружности условной четверти круга . Находится средняя точка C, вычисляется расстояние l (от 0 до C), после чего координаты C (Cx и Cy) деляться на это l, что дает координаты точки D (Dx и Dy). Получается что сектор AOB разделен пополам, теперь в зависимости от бита n (изначально старшего, т.е. = 14) выбирается какой станет точкой в следующей итерации (A или B), точка D. /forum/img/attach.gif] [url=http://www.wasm.ru/forum/files/1821571853__alg.png]1821571853__alg.png[/url] <img src="http://www.wasm.ru/forum/files/1821571853__alg.png
Хм. Баг в движке форум похоже - предыдущий мой пост редактируется вместе с содержимым страницы, но при этом отсуствует кнопка "Правка". Видать большое обилие BBcode мешает.
у меня было в голове готовое решение - я его придумал еще когда фортом увлекался - форт, как известно, изначально был целочисленный. к тому же у меня в машине не было математического сопроцессора, поэтому я им никогда и не пользовался. выбирать нужно исходя из требуемой точности.
Целочисленные вычисления в графике сакс & мастдай. Как и фиксед поинт. Флоатпоинт рулит и рулить будет.
_DEN_ а вот и не фига!!! 16.16 оч даже хорошо юзается там где большая точность не нужна или 8.24 это стоит юзать там где это возможно скорость просто офигенная. а вот если у тебя амд64 то 32.32 сам бог велел. это стоит юзать везде геде это можно втыкнуть.
Флоат вычислания, не годятся для очень точных вычислений и в тех случаях когда требуется высокая скорость, в этих случаях фиксед рулит.
При чем тут точность? 32.32 точнее флоата, и что? О диапазоне значений кто-нибудь подумал? 32.32 дает [-2*10^9 ; 2*10^9] А тот же 32 float дает диапазон порядка 2^256
отсуда мораль - в зависимости от задачи подбираются методы решения. Чтобы крутануть 3д-говнолёт достаточно фикседа, а чтобы говнолёт в реальном космосе крутануть там и флота имхо не особо хватает. Хой.
_DEN_ Что тебе мешает взять n двордов для создания той точности которая тебе необходима? Причем это будет действительно точно, в отличие от флоат.