質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

8890閲覧

[python]単位付きの数値を便利に扱うクラス

nikori

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/28 01:28

単位付きの数値を上手に扱うクラスがないかと探しています。

複数の単位系が混在している環境でプログラムを書かねばならない場合、
単位の違いを上手に吸収してくれるクラスがあると便利かと考えています。

質問は、
①このようなクラスがどこかで公開されていませんか?(下記のエネルギーに関するクラスはあくまで例なので参考になるクラスでも構いません)
②自作するしかない場合、気を付けるべき方針はありますか?
以下に自分が作るならこのような感じだろうかというサンプルスクリプトを記載しました。
改善点があればご指摘いただけると幸いです。

以上よろしくお願いいたします。

python

1class EnergyUnitUnification: 2 """ 3 エネルギーの単位を統一することで利便性を高めるためのクラス。 4 全ての単位をkj/molで管理することで単位の統一を図る。 5 """ 6 HARTREE2KJMOL = 627.51 # 1 Hartree = 627.51 kJ/mol 7 8 def __init__(self, energy, unit='hartree'): 9 if unit == 'hartree': 10 self.value = energy * self.HARTREE2KJMOL 11 elif unit == 'kjmol': 12 self.value = energy 13 else: 14 print('PLEASE add new unit') 15 16 def get_hartree(self): 17 return self.value / self.HARTREE2KJMOL 18 19 def get_kjmol(self): 20 return self.value 21 22 def __add__(self, other): 23 return self.value + other.value 24 25 def __mul__(self, other): 26 return self.value + other.value

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

https://github.com/hgrecco/pint
を調査してみてはいかがでしょう?

こんなことができるようです。(3 m + 4 cm => 3.04 m)

>>> import pint >>> ureg = pint.UnitRegistry() >>> 3 * ureg.meter + 4 * ureg.cm <Quantity(3.04, 'meter')>

投稿2018/12/29 09:45

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikori

2019/01/10 08:48

ご返信が遅くなり大変申し訳ございません。 単位付き数値ではなく、単位そのものを計算式に付与するのですね。 このあたりを見ると自作単位も作成可能なようなので、ぜひ利用してみようと思います。 https://github.com/hgrecco/pint/blob/master/docs/defining.rst 有益な情報をありがとうございました。
guest

0

ベストアンサー

F#だと測定単位という仕組みが用意されていて
単位を予め定義し
Float<cm> Float<m>のように浮動小数点型に単位をつけることができます。
例えば、単位が違うものを足そうとするとコンパイルエラーになるので、
変換関数を別途定義し、単位を合わせることをプログラマに強制できます。

pythonなんで実行時エラーにするしかないでしょうが
こんな感じの仕組みを作ればいいんじゃないですかね

投稿2018/12/28 02:56

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikori

2018/12/29 01:55

ありがとうございます。 言語は違いますが、自身のやりたかったこととマッチしていました。 今回はpythonから離れられないのですが、今後勉強していきたいと思います。
guest

0


方針としては、
案1.特定の単位に変換して保存する(質問文中のスクリプトのように)
案2.設定されたまま単位と共に保存する。同じ単位同士の演算はそのまま演算する。単位が異なる物同士の演算では単位間に優先度を付けておき、高優先度の方に変換してから演算する

案2のメリットは演算誤差の発生を必要最小限に留められる事です。デメリットは実装が面倒&実行時に遅い。
どちらを取るかは、どのように使われるかによるかと思います。

投稿2018/12/28 01:39

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikori

2018/12/29 01:57

ご回答ありがとうございます。 今回は精度がそこまで重要でないため案1.を採用いたしました。 案2.は単位のif判定が遅いかと思い敬遠しておりましたが、演算誤差の観点は盲点でした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問