C++ Logo

std-proposals

Advanced search

Re: [std-proposals] Proposal to add the circle constant "tau" to the list of C++ mathematical constants

From: Tiago Freire <tmiguelf_at_[hidden]>
Date: Sat, 24 Aug 2024 08:40:41 +0000
Yes. I've defined this more often than I have used other constants.
________________________________
From: Std-Proposals <std-proposals-bounces_at_[hidden]> on behalf of Aaron Franke via Std-Proposals <std-proposals_at_[hidden]>
Sent: Saturday, August 24, 2024 1:24:38 AM
To: std-proposals_at_[hidden] <std-proposals_at_lists.isocpp.org>
Cc: Aaron Franke <arnfranke_at_[hidden]>
Subject: [std-proposals] Proposal to add the circle constant "tau" to the list of C++ mathematical constants

Hello ISO standards mailing list members,

As of C++20, ISO C++ has a collection of useful mathematical constants in the numerics library: https://en.cppreference.com/w/cpp/numeric/constants

However, there is an important constant missing: The circle constant "Tau", symbol "𝜏", with a value of 2*𝜋 or about 6.283185307179586476925286766559...

I have written a proposal document below, I would greatly appreciate for feedback on this and will do whatever I can to help move it forward. The instructions for submitting a proposal also suggest to include an abstract cover page, which I think is not necessary given the small scope of this proposal. If more information is needed, see the link in the "Acknowledgements" section.


    Document number: ???
    Date: 2024-08-23
    Audience: Library Evolution Working Group
    Reply-to: Aaron Franke <arnfranke_at_[hidden]>

    I. Table of Contents

    Introduction, Motivation and Scope, Impact On the Standard, Design Decisions, Technical Specifications

    II. Introduction

    Tau 𝜏 is a mathematical constant representing the ratio of a circle's circumference to its radius. This is also known as the circle constant, and is equal to about 6.283185307179586476925286766559... or exactly 2*𝜋 or 2*pi, representing one full turn in radians. The value Pi 𝜋 represents half of the circle constant, it is famous in mathematics and is already present in the ISO C++ standard.

    III. Motivation and Scope

    The Tau 𝜏 constant allows referring to the full circle constant with one constexpr value that can be used in place of (2*pi), making many expressions easier to read, since (2*pi) is so common to see in code. While Pi is already present in ISO C++, Pi is usually accompanied by a multiplication by 2, so 2*pi. Math libraries often define a constant for this value due to how common this is. It makes sense to add the Tau constant into ISO C++ to make it available for all C++ users, rather than requiring libraries to define their own constant for this. This constant is intended to be useful for all users, and is widespread in many programming languages and libraries, including Java, Python, C#, Nim, Rust, GDScript, Processing, Crystal, Raku, Zig, and even another ISO language, Eiffel. Tau is also defined in many libraries and engines such as Unity, Godot, MathJS, and more.

    IV. Impact On the Standard

    This constant does not depend on anything, and nothing depends on it. It purely extends the available standard with one additional constant. It can be implemented in current C++ compilers and libraries, but the goal here is to put it in the standard along with the other mathematical constants since Tau is such a common and useful mathematical constant.

    V. Design Decisions

    The only two possible alternative designs are to use a different name or to not implement the constant. Some languages use "2PI" or "TWO_PI", but the former starts with a number so it is tricky to use as an identifier, and it can be confused with another constant in some languages, "2_PI" or "M_2_PI" in GCC, which is 2 divided by pi. The name Tau is unambiguous and is used in many programming languages, including Java, Python, C#, Nim, Rust, and more listed above. Therefore the design decision to use the name Tau is consistent with other languages and libraries.

    VI. Technical Specifications

    The technical specification is to add constants to the standard library header `<numbers>` https://en.cppreference.com/w/cpp/header/numbers inside of `namespace std::numbers {` for `tau_v` via `template<class T> inline constexpr T tau_v = /* unspecified */;` and `template<floating_point T> inline constexpr T tau_v<T> = /* see description */;`, and `tau` via `inline constexpr double tau = tau_v<double>();`. The value in these constants must be defined by the ISO C++ standard as being the mathematical constant 𝜏 (Tau), also known as the circle constant, and may be noted as being exactly equal to 2*𝜋 (or 2*pi), and exactly equal to a circle's circumference divided by its radius.

    VII. Acknowledgements

    Michael Hartl for "The Tau Manifesto": https://tauday.com/

    VIII. References

    C# System.Math.Tau: https://learn.microsoft.com/en-us/dotnet/api/system.math.tau
    Crystal TAU: https://crystal-lang.org/api/1.13.2/Math.html#constant-summary
    GDScript TAU: https://docs.godotengine.org/en/stable/classes/class__at_[hidden]#class-gdscript-constant-tau
    Java Math.TAU: https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Math.html#TAU
    Nim TAU: https://nim-lang.org/docs/math.html#TAU
    Processing TAU: https://processing.org/reference/TAU.html
    Python math.tau: https://docs.python.org/3/library/math.html#math.tau
    Raku TAU: https://docs.raku.org/language/terms#term_tau
    Rust TAU: https://doc.rust-lang.org/stable/std/f64/consts/constant.TAU.html
    Zig std.math.tau: https://github.com/ziglang/zig/blob/master/lib/std/math.zig#L18


Thank you for your consideration,

Aaron Franke



Received on 2024-08-24 08:40:46