3

我正在做以下受此线程启发的事情:

>>> from decimal import *
>>> import math
>>> getcontext().prec = 1000
>>> Decimal(2**0.5)
Decimal('1.4142135623730951454746218587388284504413604736328125')
>>> Decimal(math.sqrt(2))
Decimal('1.4142135623730951454746218587388284504413604736328125')
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024924836055850737212644121497099935831413222665927505592755799950501152782060571470109559971605970274534596862014728517418640889198609552329230484308714321450839762603627995251407989687253396546331808829640620615258352395054745750287759961729835575220337531857011354374603408498847160386899970699004815030544027790316454247823068492936918621580578463111596668713013015618568987237235288509264861249497715421833420428568606014682472077143585487415565706967765372022648544701585880162075847492265722600208558446652145839889394437092659180031138824646815708263010059485870400318648034219489727829064104507263688131373985525611732204024509122770022694112757362728049573810896750401836986836845072579936472906076299694138047565482372899718032680247442062926912485905218100445984215059112024944134172853147810580360337107730918286931471017111168391658172688941975871658215212822951848847')
>>> 2**0.5
1.4142135623730951

为什么Decimal(2**0.5)不是 1000 位长?

4

1 回答 1

9

2 ** 0.5计算为 afloat然后转换为 a Decimal。相反,Decimal从一开始就使用两个 s:

>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 100
>>> Decimal(2) ** Decimal('0.5')
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573')

重要的是你使用'0.5'而不是0.5这样Decimal解释0.5它自己没有任何中间精度损失,从0.5转换为 afloat然后再转换为 a Decimal。(照0.5原样2 ** -1,可能不会有任何精度损失,但安全总比抱歉好。)

于 2013-04-27T03:09:55.263 回答