0

私はバイナリファイルで作業しており、書き込み/読み取りとctypesを使用してこのファイルのバイトチャンクに書き込み/読み取りを試みています-C互換データ型(このファイルは別のCプログラムも使用しているため)。たとえば、次のように記述します。

num = 1.221    
my_file_in = open('values.file', "wb")
value = c_float(num)     # writing 1.22099999... this a known problem
my_file_in.write(value)
.....

そして読む:

num = 1.221
chunk = c_float()    
my_file.readinto(chunk)

num とファイルから読み取ったものを比較したいのですが、chunk.value が 1.22099999 であることを知っています... numPython プログラムで変数として読み取った数値と浮動小数点数値の比較値の問題を解決する最良の方法は何ですか? 減算とイプシロンまたは別の方法を使用した比較?

math.fabs(chunk.value - num) <= epsilon

ファイルに 1.221 を書き込んでも、将来的には読み取り後の比較に問題がないのでしょうか?

4

2 に答える 2

2

イプシロンを使用した比較は、私にとって最良の方法のようです。

エラーが大きすぎると思われる場合は、 からc_floatに切り替えることができますc_double。これは Python に相当する C でありfloat、どちらも 8 バイトです。これはかなり紛らわしいですが、それでも役立つかもしれません。

于 2012-10-12T13:45:24.250 に答える
1

numpy.allclose を使用できます。

>>> import numpy as np
>>> np.allclose(1.221, 1.22099999)
True
>>> np.allclose(1.221, 1.222)
False

ソース:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html

于 2012-10-12T14:02:21.837 に答える