それは実際には再びNguyen Truong Chungです。
これまでご回答いただきました皆様、誠にありがとうございました。デバッグを続ける道を教えてくれたあなたの回答に本当に感謝しています! 現時点では、非同期の理由はなんとなくわかりましたが、具体的な解決策はまだありません。私が得た情報をあなたに提供したいと思います。うまくいけば、より多くの洞察を得ることができます。
1. 発見:
cosを使用するこの関数があります。次のようにログを出力しました。
void rotateZ( float angle )
{
if( angle )
{
const float sinTheta = sin( angle );
const float cosTheta = cos( angle );
// I logged here
myLog( "Vector3D::SelfRotateZ(%x) %x, %x", *(unsigned int*)&angle, *(unsigned int*)&cosTheta, *(unsigned int*)&sinTheta );
....
}
}
Desync は次のように発生しました。
iPad4 の場合: Vector3D::SelfRotateZ(404800d2) bf7ff708、3c8782bc iPhone4 の場合: Vector3D::SelfRotateZ(404800d2) bf7ff709、3c8782bc
2. 再テスト:
話はここで終わりではありません。理由は次のとおりです。
- ゲームの開始時に次のコード行を試しました。
{ unsigned int zz = 0x404800d2;
float yy = 0;
memcpy( &yy, &zz, 4 );
const float temp1 = cos( yy );
printf( "%x\n", *(unsigned int*)&temp1;
}
上記のコードを同じ iPhone4 で実行しました。私はこれを手に入れました:bf7ff708
そのコードをゲームの更新ループに入れましたが、得られた結果はループごとにまだ bf7ff708 でした。
さらに何ですか?値 0x404800d2 はゲームの初期化値であるため、ゲームが開始されるたびに、上記の 2 つの desync ラインが常に存在します。
3: 尋問:
そこで、上記のことは忘れて、sin、cos 関数を一時的に、dreamcode.net で見つけた単純な Taylor の実装に置き換えることにしました。desync は発生しなくなりました。
cos 関数は、同じ iPhone 4 (OS バージョン 5) では決定論的でさえないようです。
私の質問は、cos 関数が同じ電話の同じ入力に対して異なる結果を返す理由について説明がありますか? ここでは、入力 0x404800d2 と、bf7ff708 と bf7ff709 という 2 つの異なる出力があります。ただし、単純なコーディングでは結果 bf7ff709 を再現できません。
これを明確に理解するには、OS(浮動小数点版)の数学関数のソースコードが必要だと思います。上記の問題はバグレポートとして十分ですか?