`_small_angle_of_2_vectors` loses accuracy for nearly parallel vectors (naive difference of products in Kahan's formula)
Maintainer antworten meist innerhalb von 3 Tagen
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 78/100
Rechercherichtung
Lies uxarray/grid/utils.py zu _small_angle_of_2_vectors und uxarray/utils/computing.py zum vorhandenen Hilfsprogramm diff_of_products. Füge Tests für nahezu parallele Vektoren hinzu, einschließlich des bereitgestellten reproduzierbaren Falls, und vergleiche anschließend die Ergebnisse mit präzisen Winkeln für die float64-Eingaben. Als abgeschlossen gilt die Arbeit, wenn der Fehler bei kleinen Winkeln auf wenige ulps reduziert ist, ohne die bestehenden Aufrufer zu beeinträchtigen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Version
v2026.09.1 (main at 88815a8c)
How did you install UXarray?
Source
What happened?
uxarray.grid.utils._small_angle_of_2_vectors loses accuracy for nearly parallel vectors. It implements Kahan's angle formula for vectors of arbitrary length,
angle = 2 * atan2(| v|u| - u|v| |, | v|u| + u|v| |)
but forms each component of v|u| - u|v| from two separately rounded products, i.e. a naive difference of two nearly equal products. The relative error grows as eps/angle: a mean of 2.5e-12 at 1e-5 rad, 2.4e-10 at 1e-7 rad, and 2.1e-8 at 1e-9 rad (200 random pairs of different lengths per angle, against the exact angle of the float64 inputs).
The function is used by grid/angles.py (face node angles), grid/point_in_face.py (winding number), and grid/coordinates.py (bounding circles). It currently has no tests. Found while reviewing #1806.
What did you expect to happen?
Kahan's formula should be accurate to a few ulps for small angles. Evaluating each component of v|u| - u|v| with the FMA-based diff_of_products (already in uxarray/utils/computing.py) brings the mean error down to below 1e-16 for angles down to 1e-7 rad.
Can you provide a MCVE to repoduce the bug?
import math
from fractions import Fraction
import numpy as np
from uxarray.grid.utils import _small_angle_of_2_vectors
# Two nearly parallel vectors in the xy-plane, with different lengths.
theta = 1e-9
u = np.array([3.7 * math.cos(0.4), 3.7 * math.sin(0.4), 0.0])
v = np.array([0.21 * math.cos(0.4 + theta), 0.21 * math.sin(0.4 + theta), 0.0])
# Exact angle between the float64 inputs: (u x v)_z and u . v in exact rationals.
ux, uy, vx, vy = (Fraction(float(c)) for c in (u[0], u[1], v[0], v[1]))
exact = math.atan(float((ux * vy - uy * vx) / (ux * vx + uy * vy)))
got = _small_angle_of_2_vectors(u, v)
print(f"exact = {exact:.17e}")
print(f"computed = {got:.17e}")
print(f"relative error = {abs(got - exact) / exact:.1e}")
Output on main:
exact = 1.00000003822873689e-09
computed = 1.00000004983169261e-09
relative error = 1.2e-08
- Vorherrschende Sprache
- Python
- Sterne
- 231
- Forks
- 58
- Ø Merge
- 6 T. 12 Std.
- Gemergte PRs (30 T.)
- 19
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus UXARRAY/uxarray
-
ux.open_dataset currently supports structured dataEvtl. vergeben @Sevans711 hat das vor 2 Tagen übernommen. Offenbug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
UXARRAY/uxarray#1854 · 1 Kommentar · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 3 Tagen
-
developer experience
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
Maintainer antworten meist innerhalb von 3 Tagen
-
zonal_mean() and weighted_mean() should return the same type of objectEvtl. wieder frei @Sevans711 hat das vor 39 Tagen übernommen, und es ist kein Pull Request offen. Offenbug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
UXARRAY/uxarray#1733 · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 3 Tagen
-
documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Maintainer antworten meist innerhalb von 3 Tagen
-
Pre-commit bot update requires substantial code updatesEvtl. vergeben @cmdupuis3 hat das vor 2 Tagen übernommen. Offendeveloper experience github_actions
UXARRAY/uxarray#1858 · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 3 Tagen
Alle Issues in UXARRAY/uxarray
Ähnliche Issues
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
NousResearch/hermes-agent#147104 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[oblt-aw][autodoc] Document new required `shared-org-key` input for `obs-aw-dependency-review`Evtl. vergeben @github-actions hat das heute übernommen. Offen
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
Maintainer antworten meist innerhalb von 1 Tag
-
bot-triaged module: inductor oncall: pt2 topic: fuzzer triaged
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Maintainer antworten meist innerhalb von 1 Tag
-
getchaintips leaves out the active tip once a header is staged on it, where Core always lists itOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
btclib-org/btclib-node#2158 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
patrick-hudson/put.gd-desktop#979 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag