問題タブ [boost-units]

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.

0 投票する
1 に答える
508 参照

c++ - Boost.Units 周波数から期間

Boost.Units ライブラリを使用して、周波数 (たとえば 20kHz) をその期間 (50000 ナノ秒) に変換しようとしています。浮動小数点を使用したくありません。

私が抱えている問題は、単純に逆数の 1/f を取得するとゼロ切り捨てが発生するため、ナノ秒に変換した後でも結果が 0ns になることです。代わりに、最初にメガヘルツに変換してから逆数を取ると、最初のステップでゼロ切り捨てが発生します。

私が見つけた 1 つの回避策は、数量の value_type として boost::rational を使用することです。これはうまくいきますが、私には醜いと思います。より良い解決策はありますか?私は Units ライブラリにかなり慣れていないので、これまでのところ少し圧倒されています。

今のところ私の解決策:

0 投票する
2 に答える
3087 参照

c++ - Boost::units を使用して 2 つの数量を変換する最も簡単な方法は?

値をある単位から別の単位に変換したいだけの場合、これを行う最も簡単な (理想的には 1 行の) 方法は何ですか?

たとえば、値をメートル単位で保存したいのですが、マイル単位で指定します。

これを行うためのほとんどの例は、多くの行が長く、typedef とユニット定義を含み、単純なユニットのない出力を提供していないようです。

0 投票する
2 に答える
863 参照

c++ - 可能な異なるboost::dimensionでboost::quantityを保存する方法

boost::units科学プロジェクトで物理的な一貫性を確保するためにライブラリを使用しています。ブーストのドキュメントからいくつかの例を読んで試しました。寸法、単位、数量を作成できます。私はいくつかの計算をしました、それは非常にうまくいきます。それはまさに私が期待したものです...

私のプロジェクトでは、6 つの次元に基づくいくつかの異なる単位 (温度、濃度、密度など) を持つ時系列を扱います。安全で簡単な単位変換を可能にするために、時系列のディメンションと単位を表すメンバーを各チャネル クラスに追加したいと思います。また、データ処理 (インポート、変換など) はユーザー主導であるため、動的です。

私の問題は次のとおりです。boost::units構造のため、均質なシステム内の数量は異なりますが、次元が異なると、タイプが異なります。したがって、次のようなメンバーを直接宣言することはできません。

コンパイラは、テンプレートのシェブロンを使用して寸法を指定する必要があると主張します。しかし、そうすると、異なるタイプの数量 (たとえば、異なる次元の数量) を格納できなくなります。

次に、boost::units::quantity宣言を探して、ポリモーフィックな方法で使用できる基底クラスがあるかどうかを調べました。しかし、私はそれを見つけていません。代わりに、テンプレート メタ プログラミングboost::unitsを多用していることを発見しました。これは問題ではありませんが、すべてが実行時ではなくコンパイル時に解決されるため、動的なニーズに正確には適合しません。

さらに読んだ後、オブジェクトにさまざまな量をラップしようとしましたboost::variant(初めて会えてうれしいです)。

いくつかのテストを実行しましたが、うまくいくようです。しかし、私はboost::variant訪問者パターンに自信がありません。

私の質問は次のとおりです。

  • 実行時の型解決を行うための別の - おそらく最良の - 方法はありますか?
  • dynamic_castそれらの1つですか?単位変換は頻繁には行われず、関係するデータはごくわずかです。
  • 適切なソリューションである場合boost::variant、その欠点は何ですか?
0 投票する
0 に答える
670 参照

c++ - boost::units でスケーリングされたユニットと派生ユニットを混合する

boost::unitsプロジェクトで を使用して、次元分析と単位系間の自動変換を使用したいと考えています。コード内の量を標準の工学単位で表現したいと思います。これは多くの場合、他の単位のスケーリングされたバージョンです。これを例を挙げて説明しましょう。次のシステムを定義するとします。

次に、長さの単位がフィート、力、lb*ft*s^-2圧力で定義されlb*ft^-1*s^-2ます。ただし、ポンドフォース単位で力を使用し、平方インチあたりのポンドフォースである PSI で圧力を使用したいと思います。スケーリングされた単位を使用してこれらを表現し、交換可能に使用できると思っていましたが、そうではないようです。

私はこれを試しました:

問題なくコンパイルされました。しかし、次のようにスケーリングされたユニットを使用しようとしたとき:

コンパイルは「実行可能な変換エラー」で失敗しました。スケーリングされた単位のポイントは、これらの変換を自動的に行うことだと思いました。また、ドキュメンテーションでは、ポンド力の量を出力するには name_string と symbol_string を定義するだけでよいと思いましたが、これは

「boost::units::scale_list_dim にシンボルという名前のメンバーがありません」というエラーが発生しました。これらの関数のオーバーロードは、スケーリングされたユニットでは機能しないようです。

多分私はこのような別のシステムを定義する必要があります

しかし、長さを ft で、圧力を psi で表現したい場合は、とにかく変換​​が必要です。

誰かがより良い解決策を持っていれば幸いです。

0 投票する
1 に答える
968 参照

c++ - boost::units::metric::hour_base_unitをboost::units::si::timeに変換する方法は?

次のコードを適切にコンパイルしたいと思います。

gcc を使用すると、次のエラーが表示されます。

私は何が欠けていますか?

0 投票する
0 に答える
103 参照

floating-point - Boost.Units でのカスタム単位ベースの数量間の合理的ベースの変換の実施

boost::units::si::time から派生したカスタム単位系を定義しました。子ユニットは boost::units::make_scaled_unit を使用して定義されるため、変換係数は boost::units::scale および boost::units::static_rational を使用して指定されます。たとえば、boost::units::scale<1020、boost:: units::static_rational<1> >.

一般的に、boost::units::scale::value_type が 'double' でなければ文句は言いません。その結果、数量間のすべてのランタイム変換には浮動小数点演算が含まれますが、カスタム単位間の比率はすべて整数です。たとえば、リンゴ 1 個はオレンジ 18 個に相当し、有理数ベースの係数を使用した変換で十分です。

単位変換に使用される浮動小数点演算を別のものでオーバーライドする方法はありますか? ありがとう。

編集: 1.私の数量は整数型を使用して定義されています。

0 投票する
1 に答える
214 参照

c++ - ブースト異種ユニット - バー/分

時間あたりの圧力、具体的にはバー/分を表す単位を作成する必要があります。以前に同様のユニットを作成したのと同じ方法で作成してみました:

そして、私はそれを使用しようとします:

しかし、この行は完全に理解するのに少し苦労している非常に長いエラートレイルでコンパイルされません。

Boost のドキュメントによると、均質なシステムは、線形に独立した基本ユニットでのみ構成できます。私の場合、バー (時間要素として秒を「含む」) と分を混ぜようとしています。これは私には問題があるように思えます。しかしその一方で、私のシステムには質量と長さの基本単位が含まれていないので、結局、基本は独立しているように思えます。

いずれにせよ、そのような異質なユニットを作成する例をオンラインで検索しましたが、わかりやすいものは見つかりませんでした。また、Boost のドキュメントで、異種ユニットはそれがどのように作成されたかについての情報を保存しないことを読みました。これは、たとえば、BarPerMinuteRoC を Minute で乗算して Bar を戻すことができないということですか?