Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

`_small_angle_of_2_vectors` loses accuracy for nearly parallel vectors (naive difference of products in Kahan's formula)

Geschlossen Anfängerfreundlich
#1,864 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 3 Tagen

@hongyuchen1030 arbeitet bereits daran.

Seit 30.10.2026.

  • #1863 von @hongyuchen1030 — gemerged

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
78/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
numpy, python
Bereich
data, testing

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

bug
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

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus UXARRAY/uxarray

Alle Issues in UXARRAY/uxarray

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.