C# Math против XNA MathHelper
С тех пор, как мне нужно было работать с PI (3.1415...) в C# я использовал математику.PI, чтобы получить значение. Обычно я просто использую такие значения, как Math.PI/2.0
или 2.0*Math.PI
, но теперь я только что заметил, что XNA предоставляет класс MathHelper. Самое приятное в этом то, что я могу позвонить MathHelper.PiOver2
и MathHelper.TwoPi
, тем самым делая чрезвычайно тривиальный шаг еще более тривиальным. ;-)
я предположил, что эти два класса взаимозаменяемы, но я заметил, что Math.PI/2.0 != MathHelper.PiOver2
. Я пытался выяснить, почему это так, но не смог. ничего не найти. Поэтому я решил попытать счастья здесь. Что касается использования PI, существуют ли какие-либо различия между математическим классом и классом MathHelper? Одно предпочтительнее другого? Или я должен просто оставить достаточно хорошо в покое и просто убедиться, что последовательно использовать один или другой в моей программе?
3 ответов
как они не равны? Если они достаточно близки, это может быть просто традиционной проблемой, что тестирование равенства с плавающими точками почти невозможно.
кроме того, они одного типа? Мое мнение, что большинство игровых расчетов были сделаны с поплавками, где как математика.ПИ будет двойником.
посмотрите на цифры:
3,1415926535897900000000000000000 // Изв.ПИ
3,14159300000000000000000000000000000 / / MathHelper.ПИ
3,1415926535897932384626433832795 / / PI из Windows Calc
1,57079632679490000000000000000000000 / / математика.PI / 2
1,5707963705062900000000000000000 / / MathHelper.PiOver2
1,57079600000000000000000000000000000 / / MathHelper.Пи / 2
1,5707963267948966192313216916398 / / PI / 2 из Windows Calc
объяснение проблемы: потеря точности
лучший PI / 2 = математика.PI / 2
лучший PI / 2 не математика.Пи/2!
в разработке игр не используют математику.Pi константа, потеря точности незначительна, вы не увидите разницы в движении ваших игровых объектов... Производительность важнее. Используя MathHelper.PiOver2 сэкономит вам двойное деление и преобразование double to float. Это может показаться очень небольшим подспорьем, но есть вычислительно интенсивные проблемы (системы частиц), где разница значительна.