1. ホーム
  2. c

[解決済み] なぜC言語には符号なし浮動小数点がないのですか?

2022-05-12 06:43:42

質問

この質問はおかしいと思います。プログラマは時に考えすぎてしまいます。読んでみてください。

C言語では signedunsigned の整数をよく使います。符号付き整数を符号なし変数に代入するようなことをすると、コンパイラが警告してくれるのがいい。符号付き整数と符号なし整数を比較すると警告が出ますし、その他にもいろいろあります。

私はこのような警告が好きです。私のコードを正しく保つのに役立っています。

なぜ浮動小数点数に対して同じ贅沢をしないのでしょうか?平方根が負の数を返すことは絶対にありません。負の浮動小数点値が意味をなさない他の場所もあります。符号なし浮動小数点のための完璧な候補です。

私は、浮動小数点から符号ビットを取り除くことによって得られる1ビットの余分な精度については、あまり気にしていません。私は float のままでいいと思っています。 私はただ を符号なしとしてマークする としてマークし、整数で受けるのと同じような警告を受けることがあります。

符号なし浮動小数点数をサポートするプログラミング言語があることを私は知りません。

なぜ存在しないのか、何か心当たりはありますか?


EDITです。

x87 FPU には符号なし浮動小数点を処理する命令がないことは知っています。符号付き浮動小数点演算命令を使用しましょう。誤用 (たとえば 0 を下回る) は、符号付き整数のオーバーフローが未定義であるのと同じように、未定義の動作と見なされる可能性があります。

どのように解決するのですか?

C++が符号なし浮動小数点のサポートを持っていない理由は、CPUが実行する同等の機械語演算がないからです。 つまり、それをサポートすることは非常に非効率的なのです。

もしC++がそれをサポートしていたら、符号なし浮動小数点を使用することがあり、パフォーマンスが低下していることに気付かないでしょう。 C++ がそれをサポートした場合、すべての浮動小数点演算は、それが符号付きかどうかを確認する必要があります。 そして、何百万もの浮動小数点演算を行うプログラムでは、これは受け入れられません。

そこで、なぜハードウェアの実装者はそれをサポートしないのかという疑問が生じます。 その答えは、もともと符号なし浮動小数点の標準が定義されていなかったからだと思います。 言語は後方互換性を保つことを好むので、たとえそれが追加されたとしても、言語はそれを利用することができません。 浮動小数点演算の仕様については IEEE 標準 754 浮動小数点 .

符号なし浮動小数点型はありませんが、符号なし浮動小数点クラスを作成して、floatやdoubleをカプセル化し、負の数を渡そうとすると警告を投げることで回避できます。 これは効率的ではありませんが、おそらくそれらを激しく使用しないのであれば、そのわずかなパフォーマンスの損失は気にならないでしょう。

私は、符号なし浮動小数点を持つことの有用性を間違いなく理解しています。 しかし、C/C++は安全性よりも誰にとっても最適な効率を選択する傾向があります。