cheatah
Source

stdlib/tests/math_test.cpp

1// Copyright (c) 2026 BigBrain LLC. MIT-licensed (see LICENSE).
2// Original work; see ACKNOWLEDGMENTS.md for the open-source ideas we build upon.
3#include "math.hpp"
5#include <gtest/gtest.h>
7namespace m = cheatah::math;
9TEST(CheatahMath, Constants) {
10 EXPECT_NEAR(m::pi, 3.14159265, 1e-7);
11 EXPECT_NEAR(m::e, 2.71828182, 1e-7);
12 EXPECT_NEAR(m::tau, 2.0 * m::pi, 1e-12);
13 EXPECT_TRUE(m::isinf(m::inf));
14 EXPECT_TRUE(m::isnan(m::nan));
17TEST(CheatahMath, BuiltinLikeOps) {
18 EXPECT_EQ(m::abs(-7), 7);
19 EXPECT_EQ(m::min(3, 9, 1, 5), 1);
20 EXPECT_EQ(m::max(3, 9, 1, 5), 9);
21 EXPECT_DOUBLE_EQ(m::pow(2, 10), 1024.0);
24TEST(CheatahMath, ScalarFunctions) {
25 EXPECT_DOUBLE_EQ(m::sqrt(144.0), 12.0);
26 EXPECT_DOUBLE_EQ(m::floor(2.7), 2.0);
27 EXPECT_DOUBLE_EQ(m::ceil(2.1), 3.0);
28 EXPECT_DOUBLE_EQ(m::round(2.5), 3.0);
29 EXPECT_NEAR(m::log2(8.0), 3.0, 1e-12);
30 EXPECT_NEAR(m::hypot(3.0, 4.0), 5.0, 1e-12);
31 EXPECT_NEAR(m::degrees(m::pi), 180.0, 1e-9);
34TEST(CheatahMath, TranscendentalAndRounding) {
35 EXPECT_DOUBLE_EQ(m::cbrt(27.0), 3.0);
36 EXPECT_DOUBLE_EQ(m::fabs(-3.5), 3.5);
37 EXPECT_DOUBLE_EQ(m::trunc(2.9), 2.0);
38 EXPECT_DOUBLE_EQ(m::trunc(-2.9), -2.0);
39 EXPECT_NEAR(m::exp(0.0), 1.0, 1e-12);
40 EXPECT_NEAR(m::exp(1.0), m::e, 1e-12);
41 EXPECT_NEAR(m::log(m::e), 1.0, 1e-12);
42 EXPECT_NEAR(m::log10(1000.0), 3.0, 1e-12);
43 EXPECT_NEAR(m::fmod(7.0, 3.0), 1.0, 1e-12);
44 EXPECT_DOUBLE_EQ(m::copysign(3.0, -1.0), -3.0);
45 EXPECT_NEAR(m::radians(180.0), m::pi, 1e-12);
48TEST(CheatahMath, Trigonometry) {
49 EXPECT_NEAR(m::sin(0.0), 0.0, 1e-12);
50 EXPECT_NEAR(m::sin(m::pi / 2), 1.0, 1e-12);
51 EXPECT_NEAR(m::cos(0.0), 1.0, 1e-12);
52 EXPECT_NEAR(m::tan(0.0), 0.0, 1e-12);
53 EXPECT_NEAR(m::asin(1.0), m::pi / 2, 1e-12);
54 EXPECT_NEAR(m::acos(1.0), 0.0, 1e-12);
55 EXPECT_NEAR(m::atan(1.0), m::pi / 4, 1e-12);
56 EXPECT_NEAR(m::atan2(1.0, 1.0), m::pi / 4, 1e-12);
59TEST(CheatahMath, IsFiniteIsNanIsInf) {
60 EXPECT_TRUE(m::isfinite(1.0));
61 EXPECT_FALSE(m::isfinite(m::inf));
62 EXPECT_FALSE(m::isfinite(m::nan));
63 EXPECT_TRUE(m::isinf(m::inf));
64 EXPECT_FALSE(m::isinf(1.0));
65 EXPECT_TRUE(m::isnan(m::nan));
66 EXPECT_FALSE(m::isnan(1.0));
69TEST(CheatahMath, Integer) {
70 EXPECT_EQ(m::gcd(54, 24), 6);
71 EXPECT_EQ(m::factorial(5), 120);