Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 10, 2010 19:41:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ограничение float

Ну-ну. А как быть с операциями над этими числами? Сложение-вычитание сработают без проблем.
Но есть еще как минимум умножение и деление.

В теории есть числа с фиксированной точкой. Но она двоичная. Т.е. например формат вроде 14.2 означает 16 битное число, два младших бита которого за точкой.
Умножение сведется к перемножению чисел как целых и затем сдвигу результата на два бита вправо. Деление делается так же. Быстро и просто. Мне приходилось работать с такой записью, иногда она была очень к месту.

Если же использовать десятичные основания, то вместо простого сдвига придется постоянно делить и умножать. Вроде бы не так уж плохо и должно работать - но оно вам нужно? decimal решит все лучше, при том его математика будет быстрее (в теории, конечно - питоновский decimal тот еще тормоз-компенсатор).



Офлайн

#2 Янв. 21, 2011 18:02:53

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение float

Не знаю, насколько правильно поднимать старые темы, а не создавать новые. Тем не менее подниму эту.
Мне нужно хранить почти полторы тысячи первых знаков числа пи после запятой

asv13
http://calcrpnpy.sourceforge.net/clnumManual.html
http://code.google.com/p/gmpy/
decimal
мне использовать нельзя, разрешены только “батарейки”
пользуюсь алгоритмом Брента-Саламина
http://ru.wikipedia.org/wiki/%D0%9F%D0%B8_%28%D1%87%D0%B8%D1%81%D0%BB%D0%BE%29#cite_note-.D0.A0.D0.B5.D0.BA.D0.BE.D1.80.D0.B4-16

я бы с той же страницы сдул первую тысячу знаков, но выяснилось, что мне нужны полторы + нужно самому их считать.
сейчас пытаюсь найти ответ здесь
http://docs.python.org/library/stdtypes.html#numeric-types-int-float-long-complex
но мне, грешному, начинает казаться, что без сторонних модулей все-таки не обойтись. Просьба: показать, как можно обойтись только встроенными в питон средствами, чтобы заполучить полторы тысячи знаков пи после запятой



Офлайн

#3 Янв. 21, 2011 18:31:49

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

ограничение float

Для работы с вещественными числами с большой мантиссой используем класс Decimal, предварительно задав необходимую точность. Например, так:

from decimal import *
getcontext().prec = 1500 # количество знаков в мантиссе
d = Decimal( "1.1")
print( d, '**', d, '=', d**d )



Офлайн

#4 Янв. 21, 2011 18:41:10

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение float

спасибо!

UPD
очень длинное спасибо :)

3.14159265358902698013720831420614817237781581656408222332639036373197913035915919029766954118194011563242986697376981415630147808860642339996893182569136811722565012059119395527920949432711906670123385650503592882807501438488611278146821247659123178642812412618062310400183389598306369718879671363980769499834463019212160401084371653834604728111605856946463502836510314082372412431581857637091860405578477345943775791343014814977108846242747758897734492484372443922161640999884342396145536524101811533725323754728333007056467910294850352633571093497260045939721499790769965959088698202054131237066708344267860589512709091065413404795155218654808665961315577121491699254535848205724304812099977163428104748797104044113726921792613526777466698605634342716031156260703588026210150648897663927455794226956233998580314600347250023269488336240643954155209210470175428613965329288576498949550562022626837300552672389836150960127563080781166296360833285050729914135438693274140929157548806665728913044339570030990199109684034252204394923119906866452650947609465656036743151424088719975746228929138585984649385674754523154042133432792331692006448018739300875367618960202774532133128147442282990599066869096146916475766204912999011780882235327564970201999169207376482946989845549417326677923810856093489088248463438725575585559849287174030827390323119130573564697162054157189371784703023963943407580663609559844574946403375170748166933778082285928721404232409561767079614663317786216231113758574711361355297522
UPD
чорт, это не пи, сейчас пытаюсь понять, в чем загвоздка



Отредактировано (Янв. 21, 2011 18:56:57)

Офлайн

#5 Янв. 21, 2011 19:10:26

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение float

#!usr/bin/env python
import math
import decimal
decimal.getcontext().prec = 10000
a0 = decimal.Decimal("1.0")
b0 = decimal.Decimal(str(1.0 / math.sqrt(2)))
t0 = decimal.Decimal('0.25')
p0 = decimal.Decimal('1.0')
pi = decimal.Decimal('3.14')
for i in xrange(250):
a = a0
b = b0
t = t0
p = p0
a0 = (decimal.Decimal(str(a)) + decimal.Decimal(str(b))) / decimal.Decimal('2.0')
b0 = math.sqrt(decimal.Decimal(str(a)) * decimal.Decimal(str(b)))
t0 = t - p * pow((a - a0), 2)
p0 = 2 * p
pi = pow(decimal.Decimal(str(a0)) + decimal.Decimal(str(b0)), decimal.Decimal(str(2))) / (decimal.Decimal(str(4)) * decimal.Decimal((t0)))
result = open("output.out", "w")
result.write(str(pi))
приводит только к правильным 12 ти первым знакам после запятой. Почему? Алгоритм реализован правильно, грешу на точность.

UPD
сейчас читаю
http://docs.python.org/library/decimal.html?highlight=decimal#module-decimal



Отредактировано (Янв. 21, 2011 19:14:31)

Офлайн

#6 Янв. 21, 2011 19:25:43

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

ограничение float

Нельзя использовать math.sqrt(2). Нужно использовать Decimal('2').sqrt().
А вот делить, например, на обычное целое, можно: Decimal('2.23219346328468324')/2



Офлайн

#7 Янв. 21, 2011 19:30:45

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение float

Да, спасибо, только вернулся написать, что прочитал об этом. Очень большое спасибо!
UPD

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009946576407895126946839835259570982582262052248940772671947826848260147699090264013639443745530506820349625245174939965143142980919065925093722169646151570985838741059788595977297549893016175392846813826868386894277415599185592524595395943104997252468084598727364469584865383673622262609912460805124388439045124413654976278079771569143599770012961608944169486855584840635342207222582848864815845602850601684273945226746767889525213852254995466672782398645659611635488623057745649803559363456817432411251507606947945109659609402522887971089314566913686722874894056010150330861792868092087476091782493858900971490967598526136554978189312978482168299894872265880485756401427047755513237964145152374623436454285844479526586782105114135473573952311342716610213596953623144295248493718711014576540359027993440374200731057853906219838744780847848968332144571386875194350643021845319104848100537061468067491927819119793995206141966342875444064374512371819217999839101591956181467514269123974894090718649423196
до тысячного знака точно верно!



Отредактировано (Янв. 21, 2011 19:42:01)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version