2009-10-07 5 views
9

Kể từ khi tôi cần làm việc với PI (3.1415 ...) trong C# Tôi đã sử dụng Math.PI để lấy giá trị. Thông thường tôi sẽ chỉ sử dụng các giá trị như Math.PI/2.0 hoặc 2.0*Math.PI, nhưng bây giờ tôi vừa nhận thấy rằng XNA cung cấp một lớp MathHelper. Điều tốt đẹp về điều này là tôi có thể gọi MathHelper.PiOver2MathHelper.TwoPi, do đó làm cho một bước cực kỳ tầm thường thậm chí còn tầm thường hơn. ;-)C# Toán so với XNA MathHelper

Tôi giả định hai lớp này có thể hoán đổi cho nhau, nhưng tôi nhận thấy rằng Math.PI/2.0 != MathHelper.PiOver2. Tôi đã cố gắng để nghiên cứu tại sao điều này sẽ được, nhưng tôi không tìm thấy gì. Vì vậy, tôi nghĩ tôi sẽ thử vận ​​may của mình ở đây. Liên quan đến việc sử dụng PI, có sự khác biệt nào giữa lớp Toán và lớp MathHelper không? Là một trong những ưu tiên hơn khác? Hoặc tôi có nên để đủ tốt một mình và chỉ cần đảm bảo luôn sử dụng một hoặc một trong chương trình của tôi?

+0

Tôi sẽ ngạc nhiên nếu MathHelper không gọi Math.PI đằng sau hậu trường. –

Trả lời

11

Bằng nhau như thế nào? Nếu chúng đủ gần, điều này có thể chỉ là vấn đề truyền thống mà việc kiểm tra sự bình đẳng với các điểm nổi là gần như không thể.

Ngoài ra, chúng có cùng loại không? Ý kiến ​​của tôi là tính toán chơi game nhất đã được thực hiện với phao nổi, nơi Math.PI sẽ là một đôi.

EDIT: MathHelper does indeed use floats

+0

Nó không thực sự là một vấn đề với thử nghiệm cho sự bình đẳng kể từ khi tôi tìm thấy điều này ra của tôi nhìn vào sự khác biệt, mà sẽ dẫn đến 0.000000000 nếu họ là như nhau. Thay vào đó: MathHelper.Pi - Math.PI = 8.74227801261895E-08. Điều này chắc chắn đủ gần đối với những gì tôi cần kiểm tra. Tôi chỉ tò mò tại sao chúng lại khác. Nhưng, tôi đồng ý, nó phải là một vấn đề nổi so với đôi. – SuperSized

+1

Điều đó tắt bởi 10^-8 có thể là dấu hiệu của sự khác biệt nổi -> gấp đôi về độ chính xác, đặc biệt là một phao chỉ chính xác đến khoảng 7-8 chữ số. – CoderTao

7

Look để chữ số:

3,1415926535897900000000000000000 // Math.PI

3,1415930000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // PI từ Windows Calc


1,5707963267949000000000000000000 // Math.PI/2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi/2

1,5707963267948966192313216916398 // PI/2 từ cửa sổ Calc


Giải thích về vấn đề: Sự mất mát trong chính xác

nhất PI/2 = Math.PI/2

+0

Pi đến 10000 dp: http://joyofpi.com/pi.html –

+0

Cảm ơn bạn đã liên kết tốt – AndreyAkinshin

3

Tốt nhất PI/2 không phải là Math.PI/2!

Khi phát triển trò chơi không sử dụng hằng số Math.PI, mất độ chính xác là không đáng kể, bạn sẽ không thấy sự khác biệt trong chuyển động của đối tượng trò chơi của bạn ... Hiệu suất là quan trọng hơn. Sử dụng MathHelper.PiOver2 sẽ giúp bạn tiết kiệm một bộ phận đôi và một đôi để chuyển đổi nổi. Điều này có vẻ là rất ít giúp đỡ, nhưng có những vấn đề tính toán chuyên sâu (hệ thống hạt), nơi sự khác biệt là đáng kể.