浮動小数点数の 16 進数表現がめったに使用されないのはなぜですか?
0x0.01
0.01が突然何かになるような驚きを避けるのに役立つようにそれらを書くのではありません0.010000000000
か?
正確に言うと、10 進数の pi の長さはどれくらいですか?
pi を直接コプロセッサにロードするこの命令 FLDPI があるようですが、なぜコードで pi を書かなければならないのでしょうか? アームにも同じ命令はありますか?
浮動小数点数の 16 進数表現がめったに使用されないのはなぜですか?
0x0.01
0.01が突然何かになるような驚きを避けるのに役立つようにそれらを書くのではありません0.010000000000
か?
正確に言うと、10 進数の pi の長さはどれくらいですか?
pi を直接コプロセッサにロードするこの命令 FLDPI があるようですが、なぜコードで pi を書かなければならないのでしょうか? アームにも同じ命令はありますか?
さて、「π はどのくらいの長さであるべきか」という質問について。これらの機能:
int main (void){printf("%.80f\n\n", 0x3.243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98p0 );}
int main (void){printf("%.80f\n\n", 3.14159265358979323846264338327950288419716939937510582097494459 );}
int main (void){printf("%.80f\n\n", 3.141592653589793 );}
まったく同じ数を出力します。
3.14159265358979311599796346854418516159057617187500000000000000000000000000000000
これ以上短くなると結果が異なります。
入力と出力の両方で、浮動小数点数には常に C99 の 16 進数表記を使用しています。
10 進形式 D.DDDDDDDDDDDDDDDDEXXX (小数点の後の 16 桁) を使用すると、double
π に最も近い倍精度浮動小数点数を含む、任意の を一意に識別することが保証されます。
C のような言語は、移植可能であることを目的としており、特定の命令セットの機能に依存するべきではありません。古い 80 ビット浮動小数点命令もかなり時代遅れですが、80 ビットで明示的に計算するプログラムにはまだ役立ちますlong double
。π の特殊なケースで3.141592653589793
は、右を取得するための最小の 10 進数表現double
です。FLDPI
また、プログラム内の定数が命令によってロードされる定数とまったく同じ場合、コンパイラは常に命令を生成できることに注意してください。ただし、繰り返しますが、80 ビット FPU は廃止されており、long double 計算用の最新のコンパイラでのみ使用する必要があります。テスト後、GCC も Clang もFLDPI
命令を生成しません0x3.243F6A8885A308D313198A2E03707344
。long double
. ラメ… バグレポートを書きたい気分です。
0x
およびp
マーカーは、整数表記によるあいまいさを避けるために必要です。16 進数では、これは非常に単純です。各 16 進数は 4 ビットを表し、通常の double は 1.<52 バイナリ桁> の形式をとります。したがって、その後のちょうど 13 桁の 16 進数1.
が有効です。10 進数では、を識別するために必要な最大 16 桁ですdouble
。これを自分で確認するには、次を実行します。
#include <stdio.h>
#include <math.h>
…
printf("%.16e\n%.16e\n", 1.0, nextafter(1.0, 2.0));
桁数が少ないと混乱が生じることがわかります。