Sinus-Berechnung auf der xBox (EDT 12/09/09)

Was ist so spektakulär an einer Sinusberechnung? Es fängt damit an, dass Programmierer manchmal nachfragen, wo denn so die wichtigen Unterschiede zwischen Code für die Xbox und dem gleichwertigen Code für den PC liegen. Diese Frage ganzheitlich zu beantworten ist nicht so einfach. Man gewinnt nämlich erst nach und nach die eine oder andere Erkenntnis über kleine Unterschiede hinzu.

Meistens – so auch gestern – meldet sich ein Freund der gerade an einem Xbox-Projekt arbeitet mit der Botschaft “Ich habe hier einen eigenartigen Effekt auf der Xbox, aber auf dem PC läufts einwandfrei”. Der Effekt von gestern: Gerenderte Partikel werden nach einigen Sekunden plötzlich nicht mehr gerendert, obwohl der selbe Code auf dem PC ein einwandfreies Ergebnis liefert.

Grund dafür war die Sinusberechnung der Box. Ein Rotationswert war abhängig von der Zeit, die üblicherweise fortlaufend addiert, und von Math.Sin() verarbeitet wird. Auf dem PC ist der Eingabewert vom Typ double. Groß genug für stundenlange Rotation. Math.Sin() nimmt auf der Xbox zwar auch einen double entgegen, verarbeitet aber offensichtlich nur float, weswegen die Rotation auch bereits nach einigen hunderttausend Millisekunden nicht mehr durchgeführt wurde.

Meine Erkenntnis für heute: Math rechnet auf der Xbox ungenauer als auf dem PC – nämlich offensichtlich nur mit float, anstatt mit double.