如何计算“sin(a^b)”,其中“a^b”可以是一个非常大的双精度数?

ari*_*tll 5 algorithm trigonometry

我想知道是否有一种算法可以做到这一点。

sin(60.9^100)例如,考虑一下,

如何60.9^100 - 2pi *N2 pi范围内制作。

Kel*_*ndy 4

这里介绍两种半自动方式。它们仍然需要手动配置,具体取决于输入。也许可以完全自动化,但至少它们提供了某种方法(以及用于检查进一步方法的结果)。编辑:发布全自动现在

\n

使用 Python 的decimal模块及其pi配方,显然 60.9^100 % 2pi 约为 0.4826 (然后可以将其赋予sin)。180~290位精度计算结果(代码在最后):

\n
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...\n
Run Code Online (Sandbox Code Playgroud)\n

Wolfram Alpha失败了,计算出“零”。但对于指数 30,它仍然显示有效结果,我们匹配:

\n
WolframAlpha: 6.0148312092022347033088447399833343520115646793565705028401966310...\nMine:         6.01483120920223470330884473998333435201156467935657050284019663107410...\n
Run Code Online (Sandbox Code Playgroud)\n

另一种方法,使用从某个站点复制的 pi 的前 1001 位数字,并使用整数直到最后,给出 0.48262316221828444 (在线尝试!):

\n
a, b = 609, 100\npi = 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989\nprint(a**b * 10**(1000-b) % (2*pi) / 10**1000)\n
Run Code Online (Sandbox Code Playgroud)\n

这对大整数进行运算,“放大”10^1000,直到最终的缩小除法给出浮点数。

\n

第三种方法,使用Python fraction,也得到0.48262316221828444(在线尝试!):

\n
from fractions import Fraction\n\na, b = Fraction(\'60.9\'), 100\npi = Fraction(\'3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989\')\nprint(float(a**b % (2*pi)))\n
Run Code Online (Sandbox Code Playgroud)\n

使用十进制的代码(在线尝试!):

\n
from 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\n
Run Code Online (Sandbox Code Playgroud)\n