ari*_*tll 5 algorithm trigonometry
我想知道是否有一种算法可以做到这一点。
sin(60.9^100)例如,考虑一下,
如何60.9^100 - 2pi *N 在2 pi范围内制作。
这里介绍两种半自动方式。它们仍然需要手动配置,具体取决于输入。也许可以完全自动化,但至少它们提供了某种方法(以及用于检查进一步方法的结果)。编辑:发布全自动现在
\n使用 Python 的decimal模块及其pi配方,显然 60.9^100 % 2pi 约为 0.4826 (然后可以将其赋予sin)。180~290位精度计算结果(代码在最后):
180 0.52113386128181643243087541425218797675113893601959695702254815952665...\n190 0.48262316221535366629016856570286348468626721388098119253199769818223...\n200 0.48262316221828443267196371207773451732899712100881145938907295835606...\n210 0.48262316221828443267246775208563277802202330286500415343966588161647...\n220 0.48262316221828443267246775208566344687793590859019274697600998645752...\n230 0.48262316221828443267246775208566344687793479998648411772237563268709...\n240 0.48262316221828443267246775208566344687793479998648362494580989872984...\n250 0.48262316221828443267246775208566344687793479998648362494580991864728...\n260 0.48262316221828443267246775208566344687793479998648362494580991864728...\n270 0.48262316221828443267246775208566344687793479998648362494580991864728...\n280 0.48262316221828443267246775208566344687793479998648362494580991864728...\n290 0.48262316221828443267246775208566344687793479998648362494580991864728...\nRun Code Online (Sandbox Code Playgroud)\nWolfram Alpha失败了,计算出“零”。但对于指数 30,它仍然显示有效结果,我们匹配:
\nWolframAlpha: 6.0148312092022347033088447399833343520115646793565705028401966310...\nMine: 6.01483120920223470330884473998333435201156467935657050284019663107410...\nRun Code Online (Sandbox Code Playgroud)\n另一种方法,使用从某个站点复制的 pi 的前 1001 位数字,并使用整数直到最后,给出 0.48262316221828444 (在线尝试!):
\na, b = 609, 100\npi = 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989\nprint(a**b * 10**(1000-b) % (2*pi) / 10**1000)\nRun Code Online (Sandbox Code Playgroud)\n这对大整数进行运算,“放大”10^1000,直到最终的缩小除法给出浮点数。
\n第三种方法,使用Python fraction,也得到0.48262316221828444(在线尝试!):
from fractions import Fraction\n\na, b = Fraction(\'60.9\'), 100\npi = Fraction(\'3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989\')\nprint(float(a**b % (2*pi)))\nRun Code Online (Sandbox Code Playgroud)\n使用十进制的代码(在线尝试!):
\nfrom decimal import *\n\na, b = \'60.9\', 100\n\ndef pi():\n """Compute Pi to the current precision.\n\n >>> print(pi())\n 3.141592653589793238462643383\n\n """\n getcontext().prec += 2 # extra digits for intermediate steps\n three = Decimal(3) # substitute "three=3.0" for regular floats\n lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24\n while s != lasts:\n lasts = s\n n, na = n+na, na+8\n d, da = d+da, da+32\n t = (t * n) / d\n s += t\n getcontext().prec -= 2\n return +s # unary plus applies the new precision\n\nfor prec in range(100, 300, 10):\n setcontext(Context(prec=prec, Emax=MAX_EMAX, Emin=MIN_EMIN))\n\n x = Decimal(a) ** b\n\n try:\n print(prec, str(x % (2*pi()))[:70] + \'...\')\n except:\n pass\nRun Code Online (Sandbox Code Playgroud)\n