問題タブ [numeric-limits]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ での単純な数式のコンパイル時の最適化
基本的に、配列のすべての要素に定数を追加するコードがあります
行列のスカラー型はunsigned short int
です。私が検討している他のいくつかのオプションは次のとおりです。
と
2 番目の解決策は私には最も読みやすいように見えますが、1 番目のオプションと比較してペナルティを支払う必要があります。コンパイル時にこれを事前計算する標準コンパイラはありますか?
現在 gcc 4.6.3 を使用していますが、古いコードに依存しているため、C++11 は使用していません。
アップデート:
アセンブリ出力に関する私の限られた知識から、コンパイラはそれを最適化していないと言います。-std=c++0x フラグを付けても話は同じです。
アセンブリ出力は次のとおりです。
ハードコーディングされたリテラル(26 行目を参照)
Update2
-O2 フラグを使用すると、-std=c++0x フラグを使用するかどうかに関係なく、同一のアセンブリ ファイルが生成されます。
結論
-O2 などの最適化フラグが適切に機能するため、おそらく Method2 がベスト プラクティスです。また、これらのコードはクラス メンバー メソッドの一部になっているため、初期化されたプライベート const 変数を使用することになりました。std::numeric_limits<MyMatrix::Scalar>::max()/2 + 1
c++ - 大量のユーザー入力を限界まで減らしますか? (C++)
私の C++ プログラムには、端末から 1 つの数値を収集する関数があります。
ユーザーからの数値入力を受け入れ、signed long long int の範囲外の数値を正確な制限まで減らし、ユーザーに削減を正しく通知し、正常に戻るようにしたいと考えています。
数値以外の入力はすべて完全に破棄し、ユーザーに無限に再プロンプトを表示する必要があります。
大きすぎる入力は自動的に符号付きの制限まで減らされると思っていましたが、代わりにこの関数はそれらを無効として扱い、数値以外の再プロンプトを表示します。どうすればこれを修正できますか?
iostream、string、および climits を含め、名前空間 std をグローバルに使用しています。
c++ - ゲーム/プログラムはC ++で制限を超える数値をどのように計算しますか?
すべてのタイプの値 (int、float など) に制限がある場合、Excel やゲームなどのプログラムはこれらよりも大きい数値をどのように計算しますか? 企業は独自の計算機を作成していますか? これを処理する標準ライブラリはありますか?
編集:明快さ
c++ - 条件としての std::numeric_limits
テンプレートの動作を使用std::numeric_limits<T>::is_integer
して変更する方法はありますか?std::numeric_limits<T>::is_specialized
たとえば、これを行うことができます:
c++ - numeric_limits::max および「'int (*)()noexcept (true)' から 'value_t {aka int}' への無効な変換」
typedef unsigned int value_t;
関数を使用して定義された型があります
コンパイラはコンパイルを拒否し、「int (*)()noexcept (true)」から「value_t {aka int}」への変換が無効です。
どういう意味ですか?numeric_limits クラスを調べると、min()
関数はテンプレート typename を介して渡された型の変数を返す必要があるためvalue_t
、この場合は. では、なぜコードがコンパイルされないのでしょうか?
c++ - double または long double が long long に収まるかどうかを正しく確認するにはどうすればよいですか?
最初の考えでは非常に単純に思えますが、このケースをカバーする適切な説明が見つかりませんでした。
64 ビット値を返すメソッドがあります。値は値を使用して内部的に計算されlong double
ます。long double
メソッドの最後で、が値の範囲内にあるかどうかを確認し、long long
それ以外の場合は最大long long
値を割り当てたいと思います。
負の結果がないため、正の範囲のみをチェックする次のコードを使用します。
今私は疑問に思います、long double
a に等しいことができdouble
ます. 変換static_cast<long double>(std::numeric_limits<long long>::max())
は常に正しく行われますか?
または、範囲を確認する別のより良い方法はありますか?
c++ - numeric_limits にバグがありますか、それとも単に混乱しているだけですか?
加算演算が double をアンダーフローするかどうかを判断するコードをデバッグしているときに、少なくとも自分の頭の中で奇妙な動作に遭遇しました。これは、私が見つけたものを示すサンプルプログラムです。
このコードを実行すると、結果として true になります。これはバグですか、それとも睡眠不足ですか?
c++ - C++では、1024ビットをわずか8バイトに2倍に格納できますか?
ここで何が起こっているのかわかりません。
次のデータ型のサイズをバイト単位で見つけます。
何!!!
double氏は、このような大きな値をわずか8バイトでどのように保存していますか???
c++ - std::numeric_limits::max の構文エラー
次のようなクラス構造体定義があります。
問題は、「std::numeric_limits::max()」を使用できず、コンパイラーが次のように言うことです。
Error 8 error C2059: syntax error : '::'
Error 7 error C2589: '(' : illegal token on right side of '::'
私が使用しているコンパイラは Visual C++ 11 (2012) です。