この質問は、この質問のフォローアップです。Sun の数学ライブラリ( C) では、式
*(1+(int*)&x)
浮動小数点数の上位ワードを取得するために使用されますx
。ここでは、OS はリトルエンディアン表現の 64 ビットを想定しています。
上記の C 式を Python に変換する方法を考えています。ここで難しいのは、式の「&」と「*」をどのように翻訳するかです。ところで、おそらく Python には、浮動小数点数の上位ワードを取得する組み込み関数がいくつかありますか?
この質問は、この質問のフォローアップです。Sun の数学ライブラリ( C) では、式
*(1+(int*)&x)
浮動小数点数の上位ワードを取得するために使用されますx
。ここでは、OS はリトルエンディアン表現の 64 ビットを想定しています。
上記の C 式を Python に変換する方法を考えています。ここで難しいのは、式の「&」と「*」をどのように翻訳するかです。ところで、おそらく Python には、浮動小数点数の上位ワードを取得する組み込み関数がいくつかありますか?
これは、次の方法でより簡単に行うことができますstruct
。
high_word = struct.pack('<d', x)[4:8]
return struct.unpack('<i', high_word)[0]
ここで、high_word
は(IEEE 64 ビット浮動小数点形式を使用して) リトルエンディアン順の の最上位 4 バイトで構成されるbytes
オブジェクト (または 2.x の a ) です。次に、それを 32 ビット整数にアンパックします (シングルトン タプルで返されるため、)。str
x
[0]
これは、プラットフォームの基本的なエンディアンに関係なく、常にすべてにリトル エンディアンを使用します。ネイティブ エンディアンを使用する必要がある場合は、<
をに置き換えます (ビッグ エンディアンを強制するにはまたはを=
使用します)。また、C では保証されていない 64 ビット double と 32 ビット int も保証されます。その保証も削除できますが、質問が無意味になるため、削除する正当な理由はありません。>
!
これはポインター演算で行うことができますが、いじり回す必要がctypes
あり、Python の float から C の float への変換には依然として比較的コストがかかります。struct
コードははるかに読みやすくなっています。