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 ответов


как они не равны? Если они достаточно близки, это может быть просто традиционной проблемой, что тестирование равенства с плавающими точками почти невозможно.

кроме того, они одного типа? Мое мнение, что большинство игровых расчетов были сделаны с поплавками, где как математика.ПИ будет двойником.

EDIT:MathHelper действительно использует поплавки


посмотрите на цифры:

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. Это может показаться очень небольшим подспорьем, но есть вычислительно интенсивные проблемы (системы частиц), где разница значительна.