Математика C # против XNA MathHelper - PullRequest
9 голосов
/ 07 октября 2009

С тех пор, как мне нужно было работать с PI (3.1415 ...) в C #, я использовал Math.PI для получения значения. Обычно я просто использовал бы значения типа Math.PI/2.0 или 2.0*Math.PI, но теперь я только что заметил, что XNA предоставляет класс MathHelper. Приятно то, что я могу назвать MathHelper.PiOver2 и MathHelper.TwoPi, что делает чрезвычайно тривиальный шаг еще более тривиальным. ; -)

Я предполагал, что эти два класса взаимозаменяемы, но заметил, что Math.PI/2.0 != MathHelper.PiOver2. Я пытался выяснить, почему это так, но ничего не нашел. Итак, я думал, что попробую свою удачу здесь. Что касается использования PI, есть ли различия между классом Math и классом MathHelper? Один предпочтительнее другого? Или я должен просто оставить себя в покое и убедиться, что я постоянно использую то или иное в моей программе?

Ответы [ 3 ]

11 голосов
/ 07 октября 2009

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

Кроме того, они одного типа? Мое мнение было, что большинство игровых вычислений были сделаны с плавающей точкой, где Math.PI был бы удвоен.

РЕДАКТИРОВАТЬ: MathHelper действительно использует поплавки

7 голосов
/ 07 октября 2009

Посмотрите на цифру:

3,1415926535897900000000000000000 // Math.PI

3,1415930000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // PI из Windows Calc


1,5707963267949000000000000000000 // Math.PI / 2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi / 2

1,5707963267948966192313216916398 // PI / 2 из Windows Calc


Объяснение проблемы: потеря точности

Best PI / 2 = Math.PI / 2

3 голосов
/ 28 июля 2011

Best PI / 2 не Math.PI / 2!

В разработке игр не используйте константу Math.PI, потеря точности незначительна, вы не увидите разницу в движении ваших игровых объектов ... Производительность важнее. Использование MathHelper.PiOver2 сэкономит вам двойное деление и двойное преобразование в число с плавающей точкой. Может показаться, что это очень мало поможет, но есть вычислительные проблемы (системы частиц), где разница значительна.

...