これは、Pythonの整数ではなくCの整数を使用しているため、Pythonの動作ではなくCの動作と一致するためです。これは以前、制限として文書化されていたと確信していますが、今は見つかりません。バグとして報告したい場合は、https://github.com/cython/cython/issuesにアクセスしてください。ただし、これは互換性のために速度を意図的にトレードオフしたものではないかと思います。
コードは次のように変換されます
__Pyx_pow_long(2, -1L)
どこ__Pyx_pow_long
タイプの関数ですstatic CYTHON_INLINE long __Pyx_pow_long(long b, long e)
。
それを修正する最も簡単な方法は、数値の1つまたは両方を浮動小数点数に変更することです
print(2. ** (-1))
デザインの選択に関する一般的なコメントとして:Cの世界の人々は一般的にint operator int
を返すことを期待してint
おり、このオプションが最速になります。Pythonはこれまで、Python 2の除算動作でこれを試みました(ただし、一貫性がありません-パワーは常に浮動小数点数を返しました)。
Cythonは通常、Pythonの動作を追跡しようとします。ただし、多くの人がスピードのためにそれを使用しているので、特に人々がタイプを指定するとき(それらの人々はスピードを望んでいるため)、Cのような迅速な操作にフォールバックしようとします。ここで何が起こったのかは、型を自動的に推論することができたので、デフォルトでC動作になっていると思います。私は理想的には、指定されたタイプと推論されたタイプを区別する必要があると思います。ただし、それを変更し始めるのもおそらく遅すぎます。
language_level
あなたがコンパイルしているPythonのバージョンに設定しますか?(language_level
お使いのPythonバージョンと不一致がある場合でも、この不一致はおそらくバグですが、この情報は問題の診断に重要です。)