# Symbolic sqrt(2) and sin(pi)

**URL:** <https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633>\
**Category:** Specific Domains\
**Tags:** symbolic\
**Created:** [April 4, 2021, 7:03pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633 "2021-04-04T19:03:25Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![oscarbenjamin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscarbenjamin/32/22868_2.png) [@oscarbenjamin](https://discourse.julialang.org/u/oscarbenjamin)\
**Post date:** [April 4, 2021, 7:03pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/1 "2021-04-04T19:03:25Z")

</div>

> [@CAS Best Practices](https://discourse.julialang.org/t/cas-best-practices/58092/63):
>
> How in Symbolics.jl do I create the expression `cos(0)` or `sin(pi)` or even `sqrt(2)` ?

I asked this as a genuine question but looking at Symbolics.jl more closely I get the impression that the answer is that there is no way to do this even for `sqrt(2)`. If that’s the case then this is something very different from other CAS…

Am I misunderstanding this? How can `sqrt(2)` be represented exactly?

---

<div class="post-metadata">

**Author:** ![jzr](https://avatars.discourse-cdn.com/v4/letter/j/eb9ed0/32.png) [@jzr](https://discourse.julialang.org/u/jzr)\
**Post date:** [April 4, 2021, 7:18pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/2 "2021-04-04T19:18:03Z")

</div>

Maybe there’s a missing layer at the moment, something like this?

```julia
SymbolicCall(SymbolicValue(sqrt), SymbolicValue(2))

```

or maybe

```julia
SymbolicCall(SymbolicValue(:sqrt), SymbolicValue(:2))

```

One response would be that it’s just `:(sqrt(2))` but that seems different.

---

<div class="post-metadata">

**Author:** ![oscarbenjamin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscarbenjamin/32/22868_2.png) [@oscarbenjamin](https://discourse.julialang.org/u/oscarbenjamin)\
**Post date:** [April 4, 2021, 8:44pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/3 "2021-04-04T20:44:34Z")

</div>

> [@jzr](#):
>
> One response would be that it’s just `:(sqrt(2))` but that seems different.

I don’t understand enough about Julia to know what this means but I’ll take it that there is no good way to represent `sqrt(2)` as an exact expression. That seems like a major problem to me.

---

<div class="post-metadata">

**Author:** ![jzr](https://avatars.discourse-cdn.com/v4/letter/j/eb9ed0/32.png) [@jzr](https://discourse.julialang.org/u/jzr)\
**Post date:** [April 4, 2021, 8:48pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/4 "2021-04-04T20:48:18Z")

</div>

`:(sqrt(2))` [is equivalent to](https://docs.julialang.org/en/v1/manual/metaprogramming/#Expressions-and-evaluation) `Meta.parse("sqrt(2)")`, which is like `ast.parse("sqrt(2)")` in Python.

Is that good enough? Or do we need a more semantic representation (not just a syntax tree)?

---

<div class="post-metadata">

**Author:** ![oscarbenjamin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscarbenjamin/32/22868_2.png) [@oscarbenjamin](https://discourse.julialang.org/u/oscarbenjamin)\
**Post date:** [April 5, 2021, 8:07am UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/5 "2021-04-05T08:07:30Z")

</div>

> [@CAS Best Practices](https://discourse.julialang.org/t/cas-best-practices/58092/69):
>
> ```julia
> julia> using Symbolics
> julia> Term(sqrt,[2])
> sqrt(2)
> 
> ```
> 
> I don’t get why you’d work harder than that.

Okay so:

```julia
julia> using Symbolics
[Info: Precompiling Symbolics [0c5d862f-8b57-4792-8d23-62f2024744c7]

julia> Term(sqrt, [2])
ERROR: UndefVarError: Term not defined
Stacktrace:
 [1] top-level scope at REPL[1]:1

julia> Symbolics.Term(sqrt,[2])
sqrt(2)

```

Am I supposed to spell the `using` differently to make `Term` accessible (apart from just `using Symbolics: Term`)?

It seems that `Term` works more or less as I would expect for element:

```julia
julia> expr = Term(sqrt,[2])
sqrt(2)

julia> expr * expr
sqrt(2)^2

julia> expr * expr + 1
1 + sqrt(2)^2

julia> @syms x
(x,)

julia> expr2 = x + expr
x + sqrt(2)

```

However if I now substitute an exact value for `x` I get a floating-point result:

```julia
julia> substitute(expr2, Dict([x => 0]))
1.4142135623730951

```

How can I:

1. Explicitly request for an expression like `sqrt(2)` to evaluate to an approximate floating point result with some specified precision/digits
2. Prevent the numerical evaluation when performing an exact substitution.
3. Evaluate something like `sin(pi)` exactly.

(Feel free to point to any docs that explain this but I’ve skimmed them and I don’t see these things explained or any mention of `Term`.)

---

<div class="post-metadata">

**Author:** ![oscarbenjamin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscarbenjamin/32/22868_2.png) [@oscarbenjamin](https://discourse.julialang.org/u/oscarbenjamin)\
**Post date:** [April 5, 2021, 10:09am UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/6 "2021-04-05T10:09:06Z")

</div>

> [@oscarbenjamin](#):
>
> (Feel free to point to any docs that explain this but I’ve skimmed them and I don’t see these things explained or any mention of `Term` .)

It seems I was looking in the wrong place because this is explained in the SymbolicUtils docs:  
[https://symbolicutils.juliasymbolics.org/api/](https://symbolicutils.juliasymbolics.org/api/)

> [@oscarbenjamin](#):
>
> Explicitly request for an expression like `sqrt(2)` to evaluate to an approximate floating point result with some specified precision/digits

I guess that the answer here is to use `toexpr` although I don’t see how to change the accuracy:

```julia
julia> expr
sqrt(2)

julia> toexpr(expr)
:((sqrt)(2))

julia> eval(toexpr(expr))
1.4142135623730951

```

How would I compute that with higher precision? More precisely how would I request a result with a given precision? SymPy’s evalf can compute the result accurate to any requested precision (not the same as computing _using_ a given precision). It is slow because of this. The equivalent of `toexpr` is not really `evalf` but `lambdify` which is used to make functions that can be called with numpy etc. Is there an equivalent of evalf that can do things like this:

```julia
In [18]: ((10**100 * pi) % 1).evalf(20)
Out[18]: 0.82148086513282306647

```

> [@oscarbenjamin](#):
>
> Evaluate something like `sin(pi)` exactly.

I doesn’t look like symbolics actually supports any exact evaluation. It seems to be more of a floating point library with symbols. Note that this is very different from what sympy does e.g.:

```julia
In [20]: sin(10**10000*pi)
Out[20]: 0

```

With Julia I get:

```julia
julia> sin(BigInt(10)^10000*pi)
0.9242897329862240904757015163414326685882171473043200522236191072809156717509005

```

That’s not using Symbolics but I don’t immediately see any way to get Symbolics to compute something like that exactly (without using Term and writing my own rules). This is a core feature that would typically be expected in any general purpose CAS. I realise that Symbolics is still young but I’m asking about this because I want to understand what the intended design is for how these things would be handled. Note that the evaluation architecture is a significant reason for the slowness of SymPy for some operations. Many things in SymPy could be much faster if this was changed (but it’s a lot of work and not backwards compatible etc.).

> [@oscarbenjamin](#):
>
> Prevent the numerical evaluation when performing an exact substitution.

Looking at the SymbolicsUtils docs it seems that it is based on the same architecture as SymPy’s `Basic` class. It also looks like the same fundamental design flaws have been copied over. I can use `Term` to prevent evaluation when constructing an expression just like in SymPy I can use `evaluate=False`. It doesn’t really work though because any operation (e.g. `substitute`) that rebuilds the expression tree will then cause it to evaluate. Actually the way this is implemented in SymbolicUtils might be even more problematic because it seems to default to fixed-precision floating point even for exact expressions. If I’m understanding this correctly then I strongly recommend taking a different approach where evaluation is something that only happens at the explicit request of the user.

---

<div class="post-metadata">

**Author:** ![Sukera](https://avatars.discourse-cdn.com/v4/letter/s/ce7236/32.png) [@Sukera](https://discourse.julialang.org/u/Sukera)\
**Post date:** [April 5, 2021, 12:31pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/7 "2021-04-05T12:31:46Z")

</div>

> [@CAS Best Practices](https://discourse.julialang.org/t/cas-best-practices/58092/75):
>
> If you want it exact, don’t ask for the Float64 result?
> 
> ```julia
> julia> ex = Term(sqrt,[big(2)])
> sqrt(2)
> 
> julia> eval(toexpr(ex))
> 1.414213562373095048801688724209698078569671875376948073176679737990732478462102
> 
> ```
> 
> It just follows Julia’s semantics.

To expand on this, if you only want up to a given number of digits, you can use e.g. ArbNumerics and it will just compose:

```julia
julia> using Symbolics: Term, toexpr                         
                                                             
julia> using ArbNumerics                                     
                                                             
julia> ex = Term(sqrt, [ArbFloat(2; digits=60)])             
sqrt(2.0)                                                    
                                                             
julia> eval(Symbolics.toexpr(ex))                            
1.41421356237309504880168872420969807856967187537694807317668
                                                          
julia> ex = Term(sqrt, [ArbFloat(2; digits=31)])             
sqrt(2.0)                                                    
                                                             
julia> eval(Symbolics.toexpr(ex))                            
1.41421356237309504880168872421                              

```

That’s the power julia enables here - as far as I’m aware, Symbolics.jl does not have any code specific to ArbNumerics.jl, yet it just works with custom types that have functions like `sqrt` defined on them.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 5, 2021, 12:44pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/8 "2021-04-05T12:44:37Z")

</div>

> [@Sukera](#):
>
> That’s the power julia enables here - as far as I’m aware, Symbolics.jl does not have any code specific to ArbNumerics.jl, yet it just works with custom types that have functions like `sqrt` defined on them.

Yes, exactly. This kind of handling of floating point number differences isn’t the domain of a CAS. If someone how ended up there, there’s either a design error in the language that is being used or the CAS. Symbolics.jl just lets you use anything from the entire Julia programming language, there’s nothing hardcoded for ArbNumerics.jl or MPFR BigFloats here. You can guess how it will act because it just acts like Julia, so use the numbers you want in the way that you want. We plan to add tracer options in the future which can change default capture types, but that is just sugar.

BTW, the `sin(pi)` thing is a Julia Base issue:

```julia
julia> @which sin(pi)
sin(x::Real) in Base.Math at math.jl:404

```

that is unrelated to Symbolics.jl. IMO there is a missing irrational dispatch for that.

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [April 5, 2021, 1:14pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/9 "2021-04-05T13:14:41Z")

</div>

> [@ChrisRackauckas](#):
>
> BTW, the `sin(pi)` thing is a Julia Base issue:

Replacing `sin(x*pi)` with `sinpi(x)` would help?

```julia
julia> setprecision(100_000)
100000

julia> sin(BigInt(10)^10000*pi)
6.2291952554614160595714553377768776304733861578927208509155785804589737175845776190271243662928273254627758471990538908896437289209144688944856633452612543512586041464286920381009994890655242697807378198746724448339355760541377587435337632005819199942175343771025178135082185942395662403008358550987699025777846466218629948018723355155266607146778809161453859061478492928115116456804932875211966928124714147002250783861894569764811038772366436395853243192131847235452839090556579624664377241245295931322812035833160707211136786611955973417028541367235387920728883219471790339850530208889643643772699170849247200257950461599583075813091298219011226984228746483063997112674542690974323109140297893980768779558563706239891287353195528406674553585152328731242200480286576982687792792034655747398327268738687274256887181965202284905305321896576541911716048266554364436149377329885281518128154132723429182375251350731341642606386143847098871822927361544804831641561341822397134592609924841543245800728073700999399883316429250239616760682455936947707143946936340830802570484232943686591558802285929042308606087200317185022514859949027504555813240853542280313119231000729420360638918632242889336112163332014222768713946607913119366189561334739073292364944061830663732522909188007231228049097729404110196895495977971723744708881355162967856548617995748493762086746317731261139185070461147719058497057507451360168240144732552279219161932916653023681426772394224689683200598605665410706512726367866965947648360674365770548505092671580883056715970668812378089566687605481448799597161922729835143662387338158333094147527935563045236974693752577693487437173281256746330874060138699025008822606290356126843101248420125196379864789342101334108796233625340716503370269849634203643703247201002182623046474515872162737921856167043154374756521786678610974959394726962521261918200136868868298997481862699837384966528574800135217228805448984847283055542541503053525604079701859658229227637636784542243283732924428737569554963784645342460494865693810975019602666157698843845782602351851951008053001524357814458310815104457181293607359756042407928513926640752114172839912126294951209798189116061244409060132150043796047181064811755814606329162778263726127924495759522751486966146427952773241299615071357645093528661497214741390959561691602173024208828099598728176965875628937900848599897196804219732182730203147595987172968910100660584573756505679763562902900807275793175078325763960878129582136948750887376611244677845949477064161276606263909817256103792095742066935991990736552671568309123001513527654052833239743439696384733803746119355381303479521987314265580478637275496331242455271534221527827238653314226351011581064118803819923096598499638581130877438028626702055610706259055847112866077548672925689229574083680846460022471602814721029659241237469962087857616542063755544408296428029010762548214833359346891256531783652355791091857327971018687793015867170146143805507228944067909657741628845136262159848279866274943386391423057285225515246533257501877813752467690643727668690990304857097659494765712863270992351617887143791839672598213307644745643807473079664717659068956049134219557960325135036581020919801695721067437004386096970007814087817226304156359703532285836542148848594855280029700584282954377167985254072342595390374630432552769167361960507030871756206141685759755944794955073893315680111878825808242136949080855513206453108777246646037289217688902308371485265693385677254857959703729369440945669091342072244603141149420989897968404248942705577239647482434292537211727182366263807452578526819623661495243410197640431311930209072536500900756933593679902413144474475663818512418427870855442073704896197263179946823895429385076651174244197185938621563031494723757769617045620686339946852354601969261250931344041431336073944327829676635177256831841159598518965698822489266304206193822496818718072698874126869249810054916543305153522575111539626567017803311766461941876653768307613595214738915114403170233741267837848279621711527459365764063817861003102648485777846338996048657129686509135678005856566246935100739566098120437336627841405897255628666668246432645758153394410768687270159215155586256298259017742949136716939680271490381839227834527963041422351532206000378161449100095004218547822087496093603428011079413968022543490564504974137096183234868523990755820142003967057212626945957582884201120827300442985720760760211834306345190744789596074945484918657094632947905942092226111253114356348859208255543456340456331588254138838556999834074136150305450191446602737193292966827090664864408547030357367904356636653566287170982065693496060752686480777671432560014561713042057349882609198250302402117238908473488556406961441986089667017781456559368246803225187669240495810241612307387312804089864316272624055158518451196065114449945598891981287922837650184210255407082019595790217789290621789291895046580415227614695173480352777724508253174940870341238677319617947166139975667512713733394076423572074294429754937196826341543805745826343164368176675956222203688260104285673477094097300493234401701285691161859293996134143331239093147168768614155753341979502370390771885754166510286681728222640313582945995552486769933941673168366086547131670563710663563862656517132977888257297118728283078513807515613908695707140696288070734390653441437685103274183965651043770575265429426604498558423503958376748673927947875089004094823351527865640803735878367870923465337162434708788614955593291551520749555186476590022367271114165841594202640913873713125759072694168695433524407041651040142514295331759671583916142803258629252543853668822410146675739503244328140183846787569253636181966609321888973927162208702787139045405435857140293310752159236154956352350241041780351188731114121565202474832328100005306558590706186277381936199679663351917009450767972615051322630795081163782078604248366805417739602410958799638275996740384175916774468343376938079917161743989722753895904204508441462052942570543469235743408662687829783981242921621141561958092996942138039539347186265888943521222099485305083425121799570340760306451056387721769644543770180874513413698489782310626510116900707328296317017861638609816742807238212375688992349407432527605212265201960484417319045306135753270537844265772630278030257553730404522542353023454507564239130509573900567947836333710575998177425339635490672762540951401365841203530163341399129259152441505842232988884030093489765491613638547290535239932922954836189727910738821821373908941704025595509698209842433778594931762880096051149228839059193124953083569345656699673217842731034615335159016868893667828284697601382849477319105482269464457369354201165383105634267706309276026548511653604938851683524347406300467032637059305168025683537591010278310739152497929267416488506602164364892672768951250021620883972638861480858511200026321716884284201621525790255706064102617823698465150902182020756805633387680203323377347214120763676433595862318757841275020744438922494391527853546261261653884838604819243603452331412866435935808645223933766501585217789210411820338061552711379609606091596742196531088333368820688700465100609294408564410551820533767314582215326501114346925687122130684308135594947230440902359602285498903088221418616588774868345381774759436249538445862391687353270774013333605021479815009072646131287167913594348212735157141945110505028392714321280168527912079885879378711575216114588688818483851010335343571373419408895400272889461955083127003507624246526443127984483974850359827123613158837880302989406513499383133815209255151794945252159578006553441006769695393494509219239341682913749485957990977399978974428237599198797470597398928833582814929980803158676347646073036058264457595979766850440585277452863784836881378951122699834495464687582384507050955411669089588056023213740474975271899763840563840420822396777704412574923895692685705898717550851271546847613225201942962155453506687322612157820088536247747423178392465183491963506251179872999797780241613376288397038058809215055851611928080552825377257229389841396784439699381820104819078753350765882554548273173586431021660057985633830221418264777828795408408219360539279937605759810247418730603915895910364476146651601773165435983974786945426386740130485945433428383712661638403349908041224903246339717707132587331536211004308396740066164681922627403775887587659911423157309899950883362737117904002200794037685750093360315002991204722819693264650123900463438261143078208399242862702756573035661761195250290023452158527680859911977315840459249712644829502602228281562205168422091946325746275718515430589611199291472509639265526607162743292686238612125417092236942849403073230046561689440328018730209783455636897152039461396204973470583533360944009995548259190650089214983126173317086462718613159388680105686912273118509552455404876439335541519502213501255533623000663415735131949390226163587481379691823369034203098855517602956728179063062385168262069957588853392494699060427790183358639133757353930827483324682039690711430878080139954054853012220118705649206222066778178469700012532593255713234178988343833012152511737545023838935655981896698623930545020866303712114446798229607036134097056141518614666103308067737293939882817522803683956618723557192957431811302993004661006507711819860892099762468763409984586465005289527598330319286504822147668081200343745709733713230749053422531039700549749611482700080424292093579194262860190545693893459668719568899438209545644522454004214175710540587898416049335014628093570914876601646372355336405161502945120696544968991549161292764943329793356783052725129518693221104540847729926451538197127621420078735251186983107579069830863887420105723312462918149598091679384401661221402668231302042083851622804060649467688652803972075275448682183441983118667834689851702873131165886191465353040437356529087934648081623704964161763089136782243131836819442222878188252407451973148740494123563498061326858407011580023162654013225311294299569453032858563923719894505732199268187098366832545152983545189549093206582569857418574982197684004122046026251600218524205478733284873736874167995247609432055545935020846092434424370646885517654091344064272429321190044633743277665948419787722550405845036699310579033665011565213048762251116463160349549840866208648830411837849907894702113302845740842254606232065291325663899963832236606713109642619168542709281695913841977476053850361455570418087541046597776831486258541481940647049280962522443702479743555424102740994242051358088022188948125185778246292798912400096370584995057543139698319698400714875322437360721067435172788002328971019632270916138767245738898190296997730666566040350054903222177287982901982208115626628117930838088332477576165687842526831821470799153750390636760151832044950394431072308726499328165491891591137040827828578083091548122977704835651634692270913158709973748126713962217462859416553459442512042125951719241687212266550505529478323245375197117130388807624890424900213867210379118067772830694151288503903953755600489575887106261099543007526558654558606616178757061110261366215321388261212678333799788475984322418497670390632396556883838275135787665717059361013830149460423193249144014464798326678822372653180557614383409636770362266692925318942384745121586253032075554519929226845690899765620418108080230488682533685315375513074062313208478770290356970117062184042161676169102954187536270352458862207052789293715690609072204364826933091424224241297278707976673787312156246909228154995282882864814776427436109709790991108809713794943844787250474115534406480523753777110833324561157940625334460229207417102486220441493002828630750763565408597131815280607802759987976988594333666224365688727640565409187175971523116235682113957076749440819231713695610919275732614057033745887153072563139779904167582767698982659908185821891149986971032791232523706763964090465621711265466378397629064005064256183015954758617031061911068658325754096130981614194150480011286340363597147389719431730075161264828896390990950405896633469322535538229648164951133505158948190871701495452297995859729192219129916626640974511036055163167953430508278744246455210561222076063082886421330931548311234377771468134131620028300777688512849206166411420083197673093407907216474408120367977423604387231140900144755694587511029881074025172808110773028966126192264881081173654566135163184575024166148354082335318755540140527510192916898825097483308124559574140749877241073371816013211948891150040862734370710552001020423986943613900787755113266258362756923530479836467722285411013952268578807230763973120512299868547802366173939941605900111867033963011243838890229285955980477436399272682720888395716722664244294040307932361164750377589339867567786084022351717809968505243295050262162666225704085085753178529799333689992842256184347049420382627220803497636149566771971988443987506280234073684367062388295302547379038563078052704679547186871419845169560136265820268631566998588112672196465511268994031219950377881891984086664533561685837490116568395566246534426902704247173891161130531148129017077991176186548359262213977369153611024401229987545380988711834735727064093342492889435511489956371386213511202643524683411986899709897837889555207831059294402564120363237276373453365679369475937403121789643999722428417549385709452037569343035330700089791322474993288554362968234185715157728741874247509605551885624764863710937193281066229313052014387465253211792374076869019230821310235278905815605016984754602075892815152468134980380875149693023626488854094761113452389617194503829653485957447289240964665382129494442319767741524032107849464355561962686855428996088016041727574266018893605425353091976657817320826256905470067544848365404288455132579420657846924763247959613120744648811087181131938848607645393807710848037947601059957013611527632994472621425550962659728515144496399839862413438943552359831654365602355439136361391583720859426226457380784928663687574972659965162133522278825967627428409090550509194838779526983778287267516529895199959559473171113271400661090671749798064642279344578197650423143356671456398108048153170444614293393268360576134582296420378866473750902935161296743138388685453636469879143897091417068932198968924975874651882288473411678774554398842121076952380278176865059376695182805039113082874841613017558586435591771206929671992362309121013283376212583656535618152400875518333878747313654797231478602487770165741388754402429316566099479832537050770596155878329597722083771069046266168535653308821067822830038963896747725883654438904212675990098114399270632993575611437828516256363287834229065550479510200784332394242915003380484529096834522877731271728293437808377102093735855723370071838879830907943761145926126645420747997707490201178317811634182738390286211673402425590231268024134092579770314414074598015237411441845356874971472410409419771656073125277224279317522407137377499979737387519882255189044392515227434947204646425704128620905701335480158391156957267403268662315621663653384388847511421695431554700646250997858682427715839096718851290026731790344073577690254569289293640725612890064066285176593969696242366279246844889080197107648044679284233401348087891465176800554085023473067840390153391423050791051498047366883674613808526102847330992863318230845301030203148340081044182482597249153845030633694827066599602663703198769252626109853706833788666919842568018444736837547001609454571699056027164033769487187061445582376622477252470344355569220044823249727754533229143903391961347406037847630784031508002820591062979210839546568855462434619468050578771265248969428395048142774706767513432710581762666140699436104382133696306101072577564706326133799588417319735360442767342673456848385606426258340280766460112903437053006055502536115436498949970090292094587801851745275159318616969127882705221068476071064812198272139939435215922010661995073845956919749185868274243779985357404583361198289539882772189566201036916639821343767603732993017532994450332069669805348791605902338685626630362219981699304061683389992684808224917531991401996431576738586998883176574895161070575979327258834346078593910855343246854952190595563162876213940502170576117614054906191774557259516215535106350328226461676747641836581250174425240067327607425722612703176066913472629956068964482928096190431153045334581236686485601653662548675005858307641173726518787667844636384234716332980448212084401611196254156828194466935418463150934156679750918161764625095443455345999484807464502070932256221468112309544096871325111517567560528465648372680954805187149252543993102343149130560833915977307607796273384132140246447470065995036294151622229707644947607508857265403455217518383185116624677562271823368449068845795008246680968064118309118123780879652410477410561045265702898238687842958789937343222645587767449174574439145224843282254965685285825553589160118003108867164726155323950377790001304331038454661228425943391601997416932856362299389729872081038378560085569181680325390890975135151904025220597253305978920607570509415416105078346636226033201150527397592415939841362093392531978492839704570531951269937790723640842176280024466490226532832231321791413175680982794571181974617754038842652504078930540800145471053102712921745974414032996931982681413495700672309901669747942924863984766970869047889148375114296751626854972363222203156742052025800331584900757339188307919281993585084089102774974162862974118249344017049330389722862507544244369572820048543537526419696982454752377300952263018094047480298218763773496590696705855146605191021025443668987252838029219743097999354469476696351687809806857534886205445284101783800631809717866779267380791425799571525834684947515229421100747229401244706964059772951145588451039937564715095244355312270405077836767030362195717581768372164243176423298697908028237639516267163659679427453374922935644876477737547758551696018705335165162618060083371223050822558413192442346376497722456093442959516305935871573614028652445645339911151351711068734588971914600796354281889654514681988006393137263566764124125185468322178621153563696617541027562042306891618536076420305562560140384429759146256074249614060085194656828455330225591764340431936672336010269753281103215063736624844960404714507377372926703848414371281922833048741555736003925793244417868433596548363696746612901046340739738534218356380120706541666158094317855060478031171269387322552469385246913122410421060757073892836093706122549466483290052946644975285183428547939839979245560823624086450916475334884086007549103223416083076659471519662168328213737523684566775560038550984353194211306023075127943670861184066979280851711839524013341160873911246529241847821977661833560911107243878999996910523477739507321196945539924672999844174387268229027137165174995719110525441136561919316251674895051611084204437388186230323683144927254113768523510761013499081639602376526344300975933539712536104235297313297778060192945947498389503635343182541580304604818291583546281179216136811580917637750547722533705421987195090226959543214655065144808421581068630978689279958437860306144533403146927325230488822351776122706954360908314771690844367323005474494614959817256571254845755594061246813380409321387684293094726535153432718799395016333684448895978150807133397512713053859785384219139733758254733466429303625796238966306429849073438009443604492679165429525422550614217829032094272382541194380864252642900476313510616326009196810027054241602711468064765850855931661019887180057432139227168222490753375909710319343153227291410744999485168168478575826321461311391498363919574747556660640223747224485215468538767744533266376865641979147273107305966429559234313951121394100261876410271313210471363290263309805705475186741555824016912991931543319715950899270659818589967651376229303248120234907102794964559529402349654404873775706541431273344701426677174227913635825993801253408407954306403640494130327848401203534745855654764649903475381445529393129138378456403126025789420293745754402133302487810580684564096950035283318336130548968505358375359878678445356819589197218705721362132525514387530554567772449363564741446440280566290065500811972925754503326977753872544674840381021956301672906808754551146104489572172125223473732950137971787627755821806136467893150104572138832325722560020707368136239504630555648373674183846152259144494913224772198691302006264053644408456756001501231380712682577431364093638356288981970490928597290658659577397948317485930045187284220942757169367406371217963607276147119558170075267310313993121539773306635924728010285717850717386728486494271999106777540230444019693114555059222570129625884701866197201054164219485729502653346614751640375744098772561595085919043754522891414957193260839473215059803925485419462712037200150025085250090959988756252019914868402306641265234353055736728142351699251476107406531461635000876389932699776308541832124373288414682198715237885557870768410260636379585316834556474223547554952476401595813925525924098174692018622482530457838042241883639109373477896187315967201005279204889250932564537220862115668272367246760197808397690439867030704368151526259675851742168279171050951045834298839100853697914421721214725026742996066063830613727555429792119237518445651104891704925096204588006826031584075144156552222279904885339225566415437629918304609734145875381343311105739561635010391670412979749422308070139951445968413375117951504258445974030517966948404640154878511720270361574121027274929022854038881874211985134131644902874098815982163204128615361689334838906702288057221628527667909691005669053006265304820000516245754619048316559656575555778442350016767520308426846204292292181387572647871716401329193475857567600937278816464537130723623419173338312223041654780004939225103609865067329137583702546930973721920070147482473838563431197047718220857884109765382231945561871177005621258325488412027635062855811964374306226863923349322086735338093300081110998500198180242237572041614141505401837245144666589451126614418309261119406898258814913139656849624746525696075355059973746104555027386061897496002358848811377019862876128747108587215015503591589671846621075223361735948917182635570087966559479939206094159893600636832413817552462441540979333401493042095457994530609466768145410793414786961578986703769254532321585081133810026251686670479990815751899937269160732357266127308473183713288274316131666746619682188683862033215792426452354488244217929986359029507815804861280802766469137868823404988705765868605129530917075216271145354765089704470834543723037092022223829952501590575804342636031551529513583838621019206561309557075964688342289250048635385468493323730646572121678123706208786179678189437580039594178112137983299058332223093830393184180599003206776617538844158601588727963897904948892906207330038129633453028396790302106388190259255665098912612456189061217467603856846750288831372512637351265611903642277570592114975078353659410265299629996347866301840130839707892446671272760096996435307146522533976085194449481731585025228715546841398139409977606880968122612075299123424989107042316060153768139305533390944486589089706647793349987583598705502385859118253555097730758183571788748493318026483779993522990059964930842662261423550372046259481766708519461053972123408548046233368297000625500789335188310361277431255694394512739943429612372653612119833866444673611922122884286376400703852732794104207056886654670765285610065391562535107737295068455363376593735911038999215465124525716447264378986280723441952072957689323197036917779046238705104878838199297683517450545939250335867902380249030230088879693013113267290145340855606743964920612348919820096206418738338000402648908843385492373140977443816601559955229789567153964360063607482617001385205658669226927081680681227141783682446795510097070928058706321217182642963932245572621225494570836809080696304421108659477495358140409725768111901733241972747321737485236651075238325072789278769335151256800060153679422973574458875515916845277488332898777017845449605728792457252326177424561213192702274981792287213238527811764142218986171881611026224857632940502866876670026612321482084455978978591912685862466522597225361221876025043241024125686817870062368959426991934775985466198692069677281279036262923496871441282706482598908257364709713806226468930224883770593729401076268485883601612500832587244698521037198961004743121282703056922175684510466763798160017747655236949266538172383404266604434703120839190211162903882884949493658466257451307015538218837139373916047592103776376187668584939395248581505058746394020838381930586105328462865511952293664289045859286595099762963649095828725653273696695970377602842623848575080469223025574537021779134365622328916334332605480385649587094077689920714041415396702599894625526530438335775213675088914858762127013392576152683366925196409542611853252292930259833298819229461000301124876096335663788692831214970380223133192111051901622008596133764389096103973284866495291293984413040529618127523214425555058796021316882133500599626493855431050548184294202081011476200270172971236263178962260464628572702019606759037821609795915644534894054006578650507178869970989367958506990145134616512567589533279300117397104656464072115861003885947760292429610719260622495020657405751092692319967370840896774324971994312187201140892209234707893310015065372595874895190303523487956139647693506746597550648757943465289121192007215646831013447260052720934085973891943435202629971145206653603008283693543038439891477841171750904374769500827989844031668442789961911999197831348021807731207773021908885128156496790685120004053849044926090199493266783648261891632146846730213684894594668497988614428157093670765703123227922409371473098857639913162301609591663778750887494156492637466025377922165520768594901414601787700115389988556906226868123722586261244162539000474842436024454775019691848977743338713957268915148782611928669044888561387755803845368912976125098635138047902331957444657679946398058069428095410458479732565320081683165461321863142192814783464248311534816512917696566924641054909136096408208507819169831354834820197974852382040217267563150065539763912517420222391237074707409931137459301625655369128686024322958745088162672262990086531381425473116134832936276934097761348260889973806799274552540309858134354652963971919291806025259617416657489998161768012184007461247857716093373851062214465742046499976679925886184547113397610899689516399527715231873244837654689479140949836562375751316564959184082064898433795934801697378935210812356361417920417188199897450171282905301001725646579028315769822372083310302724634022032865479440890344967212484369789296741287626375027228499888975289603385741124038309894182166758427641400387297128932283665708671005064286231685273517135852343598061885809244135922382370734232549843568268639892470737316962210716463540552178656355910885388452967673464843272315298393616429329495550316227091896005190734008923785380650145954415107967952105383626908638816509528042636771027000141361496050698500696289516507808035761279315751601032657448716422760668951052576520901270263030862403850786864221487468429142223597042893288577519400718146550367594284227693674216721802396916588003879410381712803867047701824472252385572064357858224990385221464929680275832507100235222381638646931573299381115307187211329144279641420300882898418754110526477679526210047597797239093376339400926209701087892613803814514168211216891738514955675123831262483436608771015627422110500411672488036674269685816206529074179713124834309456347164765592231821758836806328007029517278461137596014143470134168601285197528064250394793495121341293869318318873464175852783589584290759364726220783174193555648187620197246838352548922024201483573206348541581554877806499790859743925131694386295850686297620580999581615307344725045436396731477919745000263525564071600071799418368044323763386004973597785262345616864197137084315251756299886867708548224454966377785015214107932752034742964471519938747024381464750372074320624540157338744604837746391782978969692863284978072847889083273547790328260706234755653735063414263331806712601244244640413405376104968663673452744497406314393380631595851290273876776538375609905870013892662585944869013481609125637608769021646135871490726028047289495786025406466692525213012736552560650594990603546603161996548808402896308788941466324827370846884176384790910166124759384505093118598695568009286593720637594333395922541291636632520811018872532584798974694186667640086625560308565460443005955859172331229826655468385658059044850813343410906071462474694249984352580919295158836783427525690432719830486027484583121165927330452424884549732336876807654772818807641284146967934214566751755143186308634590244230408796575769718756282361510069184157797018107390497459818531530506179037167753214689815807004437961747863051611456799159436512767643319516594678307580569925255088627769290305646306306550568453671861787795003632759291667820391709324457769288158960099914944420323351359492460625475408201277917222267539986321155857430876290248743165925681921073528440130494021211818371223570676102735613583644582113927580306639874800796470571148664410643416701560585521476714164192784844980088518640310173775612225344758312382572301724172602695989646046961956724011936238601863802791145653769546240346981628032089611431825604881740067449685077108287975246323497787492276231894578487992467736938436307915538840891564204839737040776139650424143048874797254158464552748815315778023878670105477463899600001821364631550961547419198138866749059417582925648923187132000824086141166770885730318601675482736361783051811198851626379729427577955574229254375806209755478119460213845717233957802953325326409341230443816478315619910099779060423342216603594947660751044472229086798198530600407670616892772255039377042432416186985050714402674644026490922259763284331979636218240713552996546452480374758189934302039935149125943811195354472699721410162966542990190856273380941061879319453410231701573859138961987953494923982165605797659256730853392534725623960797515764483217565322116896851308493166313749197523964042186037587037831603930318645404856951079227088020245308389958711374534487183861910036300695438610474379210420008826355958169e-20104

julia> sinpi(BigInt(10)^10000)
0.0

```

If you don’t want to scroll all the way to the right, it’s 6.229e-20104. Very close to 0.  
But you need a lot more than the default precision before you start getting approximately 0 as an answer.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 5, 2021, 1:25pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/10 "2021-04-05T13:25:44Z")

</div>

I still think there should be a `Base.sin(::Irrational{:π}) = false` kind of thing (maybe just `0` since `false` might scare some people).

---

<div class="post-metadata">

**Author:** ![BLI](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bli/32/37206_2.png) [@BLI](https://discourse.julialang.org/u/BLI)\
**Post date:** [April 5, 2021, 2:31pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/11 "2021-04-05T14:31:17Z")

</div>

> [@oscarbenjamin](#):
>
> Okay so:
> 
> ```julia
> julia> using Symbolics
> [Info: Precompiling Symbolics [0c5d862f-8b57-4792-8d23-62f2024744c7]
> 
> julia> Term(sqrt, [2])
> ERROR: UndefVarError: Term not defined
> 
> ```

I get the same result. However,

```julia
using Symbolics
Symbolics.Term(sqrt,[2])

```

works.

---

<div class="post-metadata">

**Author:** ![antoine-levitt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antoine-levitt/32/4008_2.png) [@antoine-levitt](https://discourse.julialang.org/u/antoine-levitt)\
**Post date:** [April 5, 2021, 2:42pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/12 "2021-04-05T14:42:32Z")

</div>

> I still think there should be a Base.sin(::Irrational{:π}) = false kind of thing (maybe just 0 since false might scare some people).

Wouldn’t help since 2pi is a float64 (which is pretty annoying when writing generic code). We’d need a “taking irrationals seriously” thing where n\*pi would also be an irrational, but it would probably lead to madness pretty soon.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [April 5, 2021, 3:00pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/13 "2021-04-05T15:00:57Z")

</div>

> [@CAS Best Practices](https://discourse.julialang.org/t/cas-best-practices/58092/69):
>
> ```julia
> julia> using Symbolics
> julia> Term(sqrt,[2])
> 
> ```

If I may ask: What is the purpose of wrapping the inputs in `[]`? Why not just `Term(sqrt, 2)`, which seems to give the same results, but is dramatically faster?

```julia
jl> @btime Term(sqrt, big(2))
  54.888 ns (3 allocations: 56 bytes)
sqrt(2)

jl> @btime Term(sqrt, [big(2)])
  742.268 ns (8 allocations: 344 bytes)
sqrt(2)

jl> @btime Term(sqrt, 2)
  6.200 ns (1 allocation: 16 bytes)
sqrt(2)

jl> @btime Term(sqrt, [2])
  781.111 ns (6 allocations: 304 bytes)
sqrt(2)

```

When you use `eval(toexpr())` the speed difference is small, but is there any difference in meaning?

---

<div class="post-metadata">

**Author:** ![oscarbenjamin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscarbenjamin/32/22868_2.png) [@oscarbenjamin](https://discourse.julialang.org/u/oscarbenjamin)\
**Post date:** [April 5, 2021, 3:10pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/14 "2021-04-05T15:10:08Z")

</div>

> [@CAS Best Practices](https://discourse.julialang.org/t/cas-best-practices/58092/75):
>
> If you want it exact, don’t ask for the Float64 result?
> 
> ```julia
> julia> ex = Term(sqrt,[big(2)])
> sqrt(2)
> 
> ```

There’s still something I don’t get:

```julia
julia> using Symbolics: Term

julia> @variables x
(x,)

julia> expr1 = Term(sqrt, [big(2)])
sqrt(2)

julia> expr2 = expr1 + x
x + sqrt(2)

julia> expr3 = substitute(expr2, Dict([x => 0]))
1.414213562373095048801688724209698078569671875376948073176679737990732478462102

julia> typeof(expr1)
Term{Real,Nothing}

julia> typeof(expr3)
Num

```

What I expected to happen is that `expr1` and `expr3` would be the same but instead `expr3` does not seem to be a symbolic object. You describe it as exact but the printed representation looks more like a high-precision approximation. In an exact representation I would expect to be able to query the object in some way to discover that it represents `sqrt(2)` symbolically but I don’t see a way to do that with `expr3`.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 5, 2021, 4:44pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/15 "2021-04-05T16:44:16Z")

</div>

> [@antoine-levitt](#):
>
> Wouldn’t help since 2pi is a float64 (which is pretty annoying when writing generic code). We’d need a “taking irrationals seriously” thing where n\*pi would also be an irrational, but it would probably lead to madness pretty soon.

Yeah, the bigger thing to do would probably be to handle it in the switch to SymbolicTracing.jl.

> [@CAS Best Practices](https://discourse.julialang.org/t/cas-best-practices/58092/82):
>
> If I may ask: What is the purpose of wrapping the inputs in `[]` ? Why not just `Term(sqrt, 2)` , which seems to give the same results, but is dramatically faster?

I’m actually surprised that works. It should be very simpler to the Expr object which has an op and arguments. I guess the analysis code is now generic enough that it just iterates through the latter argument, and numbers are iterable so it works? @shashi

> [@CAS Best Practices](https://discourse.julialang.org/t/cas-best-practices/58092/83):
>
> What I expected to happen is that `expr1` and `expr3` would be the same but instead `expr3` does not seem to be a symbolic object. You describe it as exact but the printed representation looks more like a high-precision approximation. In an exact representation I would expect to be able to query the object in some way to discover that it represents `sqrt(2)` symbolically but I don’t see a way to do that with `expr3` .

We should probably handle that in SymbolicTracing.jl as mentioned above.

---

<div class="post-metadata">

**Author:** ![oscarbenjamin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscarbenjamin/32/22868_2.png) [@oscarbenjamin](https://discourse.julialang.org/u/oscarbenjamin)\
**Post date:** [April 5, 2021, 7:51pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/16 "2021-04-05T19:51:31Z")

</div>

Maybe I can see where we have a mismatch of expectations here. I guess symbolic expressions in SymbolicUtils do not really represent mathematical objects but rather delayed or parametrised evaluation of Julia code. I’m expecting that something like `Term(sqrt, 2)` will give an object that exactly represents the irrational number \sqrt{2} but really it represents the result of the code `sqrt(2)` in Julia which is a numerical approximation of \sqrt{2}. That’s why there are different ways to write it like `Term(sqrt, big(2))` because they are different numerical approximations.

I can see how this approach could be very useful in applications using symbolics to control numerics but it is very different from exact symbolic computation. I haven’t really got my head round what the implications of this would be but I expect that it would be problematic to implement some of the traditional exact symbolic algorithms if it isn’t possible to represent and manipulate expressions involving irrational numbers exactly. Much of the theory of symbolic computation that underpins the cornerstone algorithms in other CAS is based on finitely generated extensions of the rationals and \sqrt{2} is really the simplest form of that.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 5, 2021, 8:03pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/17 "2021-04-05T20:03:31Z")

</div>

> [@oscarbenjamin](#):
>
> Maybe I can see where we have a mismatch of expectations here. I guess symbolic expressions in SymbolicUtils do not really represent mathematical objects but rather delayed or parametrised evaluation of Julia code. I’m expecting that something like `Term(sqrt, 2)` will give an object that exactly represents the irrational number √2\sqrt{2} but really it represents the result of the code `sqrt(2)` in Julia which is a numerical approximation of √2\sqrt{2} . That’s why there are different ways to write it like `Term(sqrt, big(2))` because they are different numerical approximations.

Yes, and then as I keep mentioning, think about the changes when a Cassette-like SymbolicTracing changes parsing of literals to a `Literal(2)` and you get something a bit more flexible, but that’s just sugar. For now, stick the literal you want in.

---

<div class="post-metadata">

**Author:** ![oscarbenjamin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscarbenjamin/32/22868_2.png) [@oscarbenjamin](https://discourse.julialang.org/u/oscarbenjamin)\
**Post date:** [April 5, 2021, 8:26pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/18 "2021-04-05T20:26:52Z")

</div>

> [@ChrisRackauckas](#):
>
> For now, stick the literal you want in.

I guess you mean that I can use `Literal(2)` directly but I’m not sure where I would `use` it from. Is that from Symbolics or SymbolicUtils?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [April 5, 2021, 8:40pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/19 "2021-04-05T20:40:39Z")

</div>

I mean, take a look at Cassette and SymbolicTracing and you’ll see where that’s going.

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [April 5, 2021, 10:21pm UTC](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633/20 "2021-04-05T22:21:55Z")

</div>

This seems like a very good point and I’m not entirely understanding the tracing answer. It seems like there are (at least) two different things that you want to represent here: the Julia expression `sqrt(2)` and the mathematical expression `sqrt(2)`. Tracing seems like a convenient way to construct representations of mathematical expressions, but doesn’t seem like it addresses the question of representation in the first place.

[Next page](https://discourse.julialang.org/t/symbolic-sqrt-2-and-sin-pi/58633.md?page=2)
