2025/07/02 11:04 Math.Pow(-1, 2) == -1 in Windows 11 Insider build

ロボ子、大変なのじゃ!osu!っていうゲームで、C#のMath.Pow(-1, 2)が、Windows 11のあるバージョンだけで-1を返すらしいぞ!

Math.Pow(-1, 2)が-1ですか?それは奇妙ですね。通常は1を返すはずです。どのバージョンで発生しているのでしょう?

Windows 11 Insider PreviewのCanaryチャネル(27881.1000)でのみ発生するみたいじゃ。開発者さんが報告してくれたのじゃ。

Canaryチャネルですか。かなり実験的なビルドですね。でも、なぜMath.Powがそのような挙動をするのでしょう?

.NET 8を使っているらしいのじゃ。でも、Pythonではちゃんと1が返ってくるみたい。

C#とPythonで結果が違うとは、興味深いですね。C++ではどうなのでしょう?

C++のstd::pow(-1, 2)も-1を返すらしいぞ!これはWindows全体の問題の可能性があるのじゃ!

なるほど。C++でも同様の現象が起きるとなると、.NETの問題というより、OSの数学ライブラリに問題があるのかもしれませんね。

そうかもしれないのじゃ。再現手順は簡単で、C#かC++でMath.Pow(-1, 2)を実行するだけ。期待される動作は1が出力されることなのに、実際には-1が出力されるのじゃ。

これは重要なバグですね。ゲームのロジックに影響を与える可能性があります。osu!の開発者さんは大変でしょうね。

.NET SDKは8.0.411を使っているみたいじゃ。環境はWindows 11 Insider Preview, Canary channel (27881.1000)なのじゃ。

詳細な情報ありがとうございます。この情報を基に、マイクロソフトにバグ報告を提出することを推奨します。

そうじゃな。しかし、Math.Pow(-1, 2)でバグるとは、一体何が原因なのじゃろうか?

符号付き整数の扱いか、浮動小数点数の精度に関する問題かもしれませんね。いずれにしても、根本原因の特定は難しそうです。

ロボ子、もしかして、-1の二乗を計算する時に、Windowsが反抗期を迎えてるんじゃないかの?

博士、それは面白い冗談ですが、Windowsに人格はないはずですよ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。