|
3 | 3 | <head> |
4 | 4 | <meta charset="UTF-8"> |
5 | 5 | <meta name="generator" content="Docusaurus v3.9.2"> |
6 | | -<title data-rh="true">Changelog - Compute Engine · MathLive</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://mathlive.io/img/social-card.jpg"><meta data-rh="true" name="twitter:image" content="https://mathlive.io/img/social-card.jpg"><meta data-rh="true" property="og:url" content="https://mathlive.io/compute-engine/changelog/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Changelog - Compute Engine · MathLive"><meta data-rh="true" name="description" content="Coming Soon"><meta data-rh="true" property="og:description" content="Coming Soon"><link data-rh="true" rel="icon" href="/img/logo.webp"><link data-rh="true" rel="canonical" href="https://mathlive.io/compute-engine/changelog/"><link data-rh="true" rel="alternate" href="https://mathlive.io/compute-engine/changelog/" hreflang="en"><link data-rh="true" rel="alternate" href="https://mathlive.io/compute-engine/changelog/" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://Q23Y5RN3UQ-dsn.algolia.net" crossorigin="anonymous"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Changelog","item":"https://mathlive.io/compute-engine/changelog/"}]}</script><link rel="search" type="application/opensearchdescription+xml" title="MathLive" href="/opensearch.xml"> |
| 6 | +<title data-rh="true">Changelog - Compute Engine · MathLive</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://mathlive.io/img/social-card.jpg"><meta data-rh="true" name="twitter:image" content="https://mathlive.io/img/social-card.jpg"><meta data-rh="true" property="og:url" content="https://mathlive.io/compute-engine/changelog/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Changelog - Compute Engine · MathLive"><meta data-rh="true" name="description" content="0.52.1 2026-02-19"><meta data-rh="true" property="og:description" content="0.52.1 2026-02-19"><link data-rh="true" rel="icon" href="/img/logo.webp"><link data-rh="true" rel="canonical" href="https://mathlive.io/compute-engine/changelog/"><link data-rh="true" rel="alternate" href="https://mathlive.io/compute-engine/changelog/" hreflang="en"><link data-rh="true" rel="alternate" href="https://mathlive.io/compute-engine/changelog/" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://Q23Y5RN3UQ-dsn.algolia.net" crossorigin="anonymous"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Changelog","item":"https://mathlive.io/compute-engine/changelog/"}]}</script><link rel="search" type="application/opensearchdescription+xml" title="MathLive" href="/opensearch.xml"> |
7 | 7 |
|
8 | 8 | <link rel="stylesheet" src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.11/codemirror.min.css"> |
9 | 9 | <script>!function(){var e,t;window.moduleMap||(window.moduleMap={}),window.moduleMap={...window.moduleMap,mathlive:"https://esm.run/mathlive","compute-engine":"https://esm.run/@cortex-js/compute-engine","@cortex-js/compute-engine":"https://esm.run/@cortex-js/compute-engine"},(e=["https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js","https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/javascript/javascript.min.js","https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/xml/xml.min.js","https://unpkg.com/@cortex-js/compute-engine","https://cdn.jsdelivr.net/npm/mathlive","https://cdn.jsdelivr.net/npm/@ui-js/code-playground@1.13.2/dist/code-playground.min.js@module"]).forEach((o,n)=>{const m=o.endsWith("@module"),c="script"+function(e,t=0){let o=3735928559^t,n=1103547991^t;for(let t=0;t<e.length;t++){const m=e.charCodeAt(t);o=Math.imul(o^m,2654435761),n=Math.imul(n^m,1597334677)}return o=Math.imul(o^o>>>16,2246822507),o^=Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(o^o>>>13,3266489909),4294967296*(2097151&n)+(o>>>0)}(o=o.replace("@module","")).toString(36);if(document.getElementById(c))return;const d=document.createElement("script");m&&(d.type="module"),d.id=c,d.src=o,d.async=!1,t&&n===e.length-1&&(d.onload=t),document.head.appendChild(d)})}()</script> |
|
18 | 18 | <link rel="preload" as="image" href="/img/hand-slugs.jpg" fetchpriority="high"> |
19 | 19 | <link rel="preload" as="image" href="/img/hand-gears.jpg" fetchpriority="high"> |
20 | 20 | <link rel="preload" as="image" href="/img/hand-cube2.jpg" fetchpriority="high"><link rel="stylesheet" href="/assets/css/styles.44ad2588.css"> |
21 | | -<script src="/assets/js/runtime~main.a274676f.js" defer="defer"></script> |
| 21 | +<script src="/assets/js/runtime~main.7790eb59.js" defer="defer"></script> |
22 | 22 | <script src="/assets/js/main.a713022c.js" defer="defer"></script> |
23 | 23 | </head> |
24 | 24 | <body class="navigation-with-keyboard"> |
|
46 | 46 | font-weight: 400 |
47 | 47 | } |
48 | 48 |
|
49 | | - </style><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="coming-soon">Coming Soon<a href="#coming-soon" class="hash-link" aria-label="Direct link to Coming Soon" title="Direct link to Coming Soon" translate="no"></a></h3><ul> |
| 49 | + </style><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0521-2026-02-19">0.52.1 <em>2026-02-19</em><a href="#0521-2026-02-19" class="hash-link" aria-label="Direct link to 0521-2026-02-19" title="Direct link to 0521-2026-02-19" translate="no"></a></h3><ul> |
| 50 | +<li class=""> |
| 51 | +<p>To check if a value is an exact number literal, you can now use |
| 52 | +<code>isNumber(expr) && expr.isExact</code>.</p> |
| 53 | +</li> |
| 54 | +<li class=""> |
| 55 | +<p>When using the <code>raw</code> canonical form, preserve negation, i.e. <code>x-1</code> will now |
| 56 | +parse as <code>["Subtract", "x", "1"]</code> rather than <code>["Add", "x", -1]</code>.</p> |
| 57 | +</li> |
50 | 58 | <li class=""> |
51 | 59 | <p><strong>Fix <code>;\;</code> parsing in semicolon blocks</strong>: Semicolons followed by LaTeX visual |
52 | 60 | spacing commands (<code>\;</code>, <code>\,</code>, <code>\quad</code>, etc.) no longer produce spurious |
53 | | -<code>Nothing</code> nodes in the parse tree. Previously, <code>a \coloneq x^2;\; (a+1)</code> |
54 | | -would include a <code>Nothing</code> operand in the Block, making <code>isValid</code> return |
55 | | -<code>false</code> and causing compilation to fail. The parser now skips visual spacing |
56 | | -after semicolon separators.</p> |
| 61 | +<code>Nothing</code> nodes in the parse tree. Previously, <code>a \coloneq x^2;\; (a+1)</code> would |
| 62 | +include a <code>Nothing</code> operand in the Block, making <code>isValid</code> return <code>false</code> and |
| 63 | +causing compilation to fail. The parser now skips visual spacing after |
| 64 | +semicolon separators.</p> |
57 | 65 | </li> |
58 | 66 | <li class=""> |
59 | | -<p><strong>Fix <code>\text{if}</code> parsing with <code>\;</code> spacing</strong>: The <code>\text{if}\; x \geq 0 \;\text{then}\; 1 \;\text{else}\; 0</code> pattern now parses correctly as an <code>If</code> |
60 | | -expression. Previously, <code>\;</code> before <code>\text{then}</code> or <code>\text{else}</code> prevented |
61 | | -keyword detection, producing a <code>Tuple</code> instead.</p> |
| 67 | +<p><strong>Fix <code>\text{if}</code> parsing with <code>\;</code> spacing</strong>: The |
| 68 | +<code>\text{if}\; x \geq 0 \;\text{then}\; 1 \;\text{else}\; 0</code> pattern now parses |
| 69 | +correctly as an <code>If</code> expression. Previously, <code>\;</code> before <code>\text{then}</code> or |
| 70 | +<code>\text{else}</code> prevented keyword detection, producing a <code>Tuple</code> instead.</p> |
62 | 71 | </li> |
63 | 72 | <li class=""> |
64 | 73 | <p><strong>Block serializer uses <code>; </code> separator</strong>: The Block serializer now emits <code>; </code> |
|
89 | 98 | </li> |
90 | 99 | <li class=""> |
91 | 100 | <p><strong>Fix recursive GLSL gamma function</strong>: The <code>_gpu_gamma()</code> preamble in the GPU |
92 | | -and interval-GLSL compilation targets used recursion for the reflection formula |
93 | | -(z < 0.5), which is illegal in GLSL. Replaced with a non-recursive |
| 101 | +and interval-GLSL compilation targets used recursion for the reflection |
| 102 | +formula (z < 0.5), which is illegal in GLSL. Replaced with a non-recursive |
94 | 103 | implementation that inlines the Lanczos approximation for both branches.</p> |
95 | 104 | </li> |
96 | 105 | <li class=""> |
|
104 | 113 | <li class=""> |
105 | 114 | <p><strong>Unicode superscript and subscript digit support</strong>: The LaTeX parser now |
106 | 115 | recognizes Unicode superscript digits (<code>⁰¹²³⁴⁵⁶⁷⁸⁹⁻</code>) and subscript digits |
107 | | -(<code>₀₁₂₃₄₅₆₇₈₉₋</code>), converting them to <code>^{...}</code> and <code>_{...}</code> respectively. |
108 | | -This works in all parsing modes. For example, <code>x²</code> parses as <code>x^{2}</code>, |
109 | | -<code>sin²(x)</code> as <code>\sin^{2}(x)</code>, <code>x⁻²</code> as <code>x^{-2}</code>, and <code>x₁₂</code> as <code>x_{12}</code>.</p> |
| 116 | +(<code>₀₁₂₃₄₅₆₇₈₉₋</code>), converting them to <code>^{...}</code> and <code>_{...}</code> respectively. This |
| 117 | +works in all parsing modes. For example, <code>x²</code> parses as <code>x^{2}</code>, <code>sin²(x)</code> as |
| 118 | +<code>\sin^{2}(x)</code>, <code>x⁻²</code> as <code>x^{-2}</code>, and <code>x₁₂</code> as <code>x_{12}</code>.</p> |
110 | 119 | </li> |
111 | 120 | <li class=""> |
112 | 121 | <p><strong><code>.is()</code> now works with assigned variables</strong>: Previously, <code>.is()</code> only |
|
0 commit comments