何桁目まであっているか確認する関数verifiedと、何桁目まであっているか数字で返すverified_digits


In [1]:
import pint as pn

In [2]:
a = pn.interval(1)

In [3]:
a


Out[3]:
[1.0000000000000000000000000000000000000000000000000000000000000000,1.0000000000000000000000000000000000000000000000000000000000000000]

In [4]:
a.sup = pn.roundfloat.succ(a.sup)

In [5]:
a


Out[5]:
[1.0000000000000000000000000000000000000000000000000000000000000000,1.0000000000000002220446049250313080847263336181640625000000000000]

少しずらす


In [6]:
a.verified()


Out[6]:
'1.000000000000000'

このaの下限と上限は小数点以下15桁目まであっているので、そこまで返す。


In [7]:
a.sup = pn.roundfloat.succ(a.sup)

In [9]:
a.sup = pn.roundfloat.succ(a.sup)

In [10]:
a


Out[10]:
[1.0000000000000000000000000000000000000000000000000000000000000000,1.0000000000000006661338147750939242541790008544921875000000000000]

もう少しずらす。あっている桁の一つ下を5以上に調整した


In [11]:
a.verified()


Out[11]:
'1.000000000000000'

それでも、四捨五入などはせずに切り捨てる。


In [12]:
a.verified_digits()


Out[12]:
16

整数部分を含めて、何桁目まであっているか数字で返す


In [13]:
b = pn.interval('1.1')

In [14]:
b


Out[14]:
[1.0999999999999998667732370449812151491641998291015625000000000000,1.1000000000000000888178419700125232338905334472656250000000000000]

In [15]:
b.width()


Out[15]:
2.220446049250313e-16

なお、このような幅が小さいものの、小数部分の一致が少ないものに対しては


In [16]:
b.verified()


Out[16]:
'1.'

In [17]:
b.verified_digits()


Out[17]:
1

このように精度が低いように見えてしまう。
仕様とするか、警告するかは検討中