C# Math против XNA MathHelper

С тех пор, как мне нужно было работать с 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? Один предпочтительнее другого? Или я должен просто оставить все в покое и просто постоянно использовать тот или иной метод на протяжении всей моей программы?


person SuperSized    schedule 07.10.2009    source источник
comment
Я был бы удивлен, если бы MathHelper не вызывал Math.PI за кулисами.   -  person Chuck Conway    schedule 07.10.2009


Ответы (3)


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

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

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

person CoderTao    schedule 07.10.2009
comment
На самом деле это не проблема с проверкой на равенство, так как я обнаружил это, глядя на разницу, которая должна привести к 0,000000000, если они были одинаковыми. Вместо этого: MathHelper.Pi - Math.PI = 8,74227801261895E-08. Это, безусловно, достаточно близко для того, что мне нужно проверить. Мне просто было интересно, почему они будут другими. Но, я согласен, это должна быть проблема с плавающей против двойной. - person SuperSized; 07.10.2009
comment
То, что он отличается на 10 ^ -8, вероятно, свидетельствует о двойной разнице в точности с плавающей запятой, в частности, точность с плавающей запятой составляет около 7-8 цифр. - person CoderTao; 07.10.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


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

Лучший PI/2 = Math.PI/2

person AndreyAkinshin    schedule 07.10.2009

Лучший PI/2 — это не Math.PI/2!

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

person Loránd Biró    schedule 28.07.2011