Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

[Bug] atan2 does not normalize -0.0 the way Spark does

Aperta Adatta ai principianti
#26,333 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@spicysharkco ci sta già lavorando.

Dal 15/10/2026.

  • #26394 di @spicysharkco — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
72/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
rust, sql
Ambito
databases

Direzione di ricerca

La correzione si trova in SparkAtan2 in datafusion/spark/src/function/math/atan2.rs, dove gli argomenti grezzi vengono passati direttamente a f64::atan2; aggiungi prima 0.0 a entrambi gli operandi, come descritto nell'issue. L'aspettativa da modificare si trova in datafusion/sqllogictest/test_files/spark/math/atan2.slt alla riga 155, da -3.14159 a 3.141592653589793. Esegui quel file sqllogictest e verifica che atan2(0.0, -0.0) e atan2(-0.0, -0.0) corrispondano ai risultati di Spark riportati nell'issue prima di concludere.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug spark
Describe the bug

SparkAtan2 passes the raw arguments to Rust's f64::atan2 (atan2.rs#L82). Spark's Atan2 adds 0.0 to both arguments first, which turns a negative zero into a positive zero (mathExpressions.scala#L1229-L1237). The Spark source explains why: "With codegen, the values returned by -0.0 and 0.0 are different. Handled with +0.0".

So atan2 returns a different value whenever y or x is -0.0.

To Reproduce

Spark 4.0.0:

SELECT atan2(CAST('-0.0' AS DOUBLE), -1.0D)
-- 3.141592653589793
SELECT atan2(0.0D, CAST('-0.0' AS DOUBLE))
-- 0.0
SELECT atan2(CAST('-0.0' AS DOUBLE), CAST('-0.0' AS DOUBLE))
-- 0.0

DataFusion: the existing test at atan2.slt#L155 documents the C99 result:

query R
SELECT atan2(-0.0::double, -1.0::double)
----
-3.141592653589793

The other two inputs were not run on DataFusion. By the C99 definition that Rust follows, atan2(0.0, -0.0) is pi and atan2(-0.0, -0.0) is -pi.

Expected behavior

Add 0.0 to both arguments before calling atan2, as Spark does, and change the expectation at atan2.slt#L155 to 3.141592653589793.

Additional context

Found by running the queries in datafusion/sqllogictest/test_files/spark on a local Spark and comparing the results with the expected values in the files, which is the kind of check proposed in #17045. Spark results come from Apple's build of Spark 4.0.0 (4.0.0.65-apple) with a UTC session and spark.sql.ansi.enabled=false unless stated. The Spark source links point at the v4.0.0 tag. DataFusion results are the sqllogictest expectations at 9dec77584, which CI enforces. Anything marked as not run was derived from reading the code.

Lingua principale
Rust
Stelle
9.5k
Fork
2.5k
Merge medio
4g 16h
PR unite (30g)
330

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/datafusion

Tutte le issue di apache/datafusion

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.