[解決済み] なぜC言語には符号なし浮動小数点がないのですか?
質問
この質問はおかしいと思います。プログラマは時に考えすぎてしまいます。読んでみてください。
C言語では
signed
と
unsigned
の整数をよく使います。符号付き整数を符号なし変数に代入するようなことをすると、コンパイラが警告してくれるのがいい。符号付き整数と符号なし整数を比較すると警告が出ますし、その他にもいろいろあります。
私はこのような警告が好きです。私のコードを正しく保つのに役立っています。
なぜ浮動小数点数に対して同じ贅沢をしないのでしょうか?平方根が負の数を返すことは絶対にありません。負の浮動小数点値が意味をなさない他の場所もあります。符号なし浮動小数点のための完璧な候補です。
私は、浮動小数点から符号ビットを取り除くことによって得られる1ビットの余分な精度については、あまり気にしていません。私は
float
のままでいいと思っています。 私はただ
を符号なしとしてマークする
としてマークし、整数で受けるのと同じような警告を受けることがあります。
符号なし浮動小数点数をサポートするプログラミング言語があることを私は知りません。
なぜ存在しないのか、何か心当たりはありますか?
EDITです。
x87 FPU には符号なし浮動小数点を処理する命令がないことは知っています。符号付き浮動小数点演算命令を使用しましょう。誤用 (たとえば 0 を下回る) は、符号付き整数のオーバーフローが未定義であるのと同じように、未定義の動作と見なされる可能性があります。
どのように解決するのですか?
C++が符号なし浮動小数点のサポートを持っていない理由は、CPUが実行する同等の機械語演算がないからです。 つまり、それをサポートすることは非常に非効率的なのです。
もしC++がそれをサポートしていたら、符号なし浮動小数点を使用することがあり、パフォーマンスが低下していることに気付かないでしょう。 C++ がそれをサポートした場合、すべての浮動小数点演算は、それが符号付きかどうかを確認する必要があります。 そして、何百万もの浮動小数点演算を行うプログラムでは、これは受け入れられません。
そこで、なぜハードウェアの実装者はそれをサポートしないのかという疑問が生じます。 その答えは、もともと符号なし浮動小数点の標準が定義されていなかったからだと思います。 言語は後方互換性を保つことを好むので、たとえそれが追加されたとしても、言語はそれを利用することができません。 浮動小数点演算の仕様については IEEE 標準 754 浮動小数点 .
符号なし浮動小数点型はありませんが、符号なし浮動小数点クラスを作成して、floatやdoubleをカプセル化し、負の数を渡そうとすると警告を投げることで回避できます。 これは効率的ではありませんが、おそらくそれらを激しく使用しないのであれば、そのわずかなパフォーマンスの損失は気にならないでしょう。
私は、符号なし浮動小数点を持つことの有用性を間違いなく理解しています。 しかし、C/C++は安全性よりも誰にとっても最適な効率を選択する傾向があります。
関連
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] 通貨を表すのにDoubleやFloatを使ってはいけないのですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] 浮動小数点以下の0を削除して文字列に変換する方法
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] なぜJavaは符号なしintをサポートしないのですか?
-
[解決済み] IEEE754の浮動小数点が正確に表現できない最初の整数はどれでしょう?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
C++の配列コピー
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?