From 0a7ac3d340ae920382de36760aee6de68971574f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Cruz?= Date: Wed, 12 Apr 2023 18:46:15 -0300 Subject: [PATCH] Add fsin and fcos functions to angular library --- robocin/utility/CMakeLists.txt | 2 +- robocin/utility/README.md | 4 + robocin/utility/angular.h | 43 +- robocin/utility/angular_test.cpp | 32 + robocin/utility/internal/angular_internal.h | 754 ++++++++++++++++++++ 5 files changed, 828 insertions(+), 7 deletions(-) create mode 100644 robocin/utility/internal/angular_internal.h diff --git a/robocin/utility/CMakeLists.txt b/robocin/utility/CMakeLists.txt index 32dc2f1..039c606 100644 --- a/robocin/utility/CMakeLists.txt +++ b/robocin/utility/CMakeLists.txt @@ -30,7 +30,7 @@ robocin_cpp_test( robocin_cpp_library( NAME angular - HDRS angular.h + HDRS angular.h internal/angular_internal.h SRCS angular.cpp DEPS concepts ) diff --git a/robocin/utility/README.md b/robocin/utility/README.md index 531e8e5..1ee9d04 100644 --- a/robocin/utility/README.md +++ b/robocin/utility/README.md @@ -20,6 +20,10 @@ The [angular](angular.h) header provides a set of functions to perform operation - `normalizeAngle`: normalize an angle to the range [-pi, pi]; - `smallestAngleDiff`: calculate the smallest angle difference between two angles; - `absSmallestAngleDiff`: calculate the absolute value of the smallest angle difference between two angles; +- `fsin`: get the sine of an angle in degrees from a lookup table (faster + than [`std::sin`](https://en.cppreference.com/w/cpp/numeric/math/sin), but less accurate); +- `fcos`: get the cosine of an angle in degrees from a lookup table (faster + than [`std::cos`](https://en.cppreference.com/w/cpp/numeric/math/cos), but less accurate); > **Note**: As in the standard library, additional overloads are provided for all integer types, which are treated > as `double`. diff --git a/robocin/utility/angular.h b/robocin/utility/angular.h index b6b6526..ff14c41 100644 --- a/robocin/utility/angular.h +++ b/robocin/utility/angular.h @@ -7,30 +7,31 @@ #define ROBOCIN_UTILITY_ANGULAR_H #include +#include #include #include "robocin/utility/concepts.h" +#include "robocin/utility/internal/angular_internal.h" + namespace robocin { template constexpr auto degreesToRadians(T degrees) { using F = std::conditional_t, T, double>; - constexpr F kPi = std::numbers::pi_v; - constexpr F kPiInDegrees = 180; + constexpr F kDegreesToRadiansFactor = std::numbers::pi_v / 180; - return degrees * kPi / kPiInDegrees; + return degrees * kDegreesToRadiansFactor; } template constexpr auto radiansToDegrees(T radians) { using F = std::conditional_t, T, double>; - constexpr F kPi = std::numbers::pi_v; - constexpr F kPiInDegrees = 180; + constexpr F kRadiansToDegreesFactor = 180 / std::numbers::pi_v; - return radians * kPiInDegrees / kPi; + return radians * kRadiansToDegreesFactor; } template @@ -40,6 +41,10 @@ constexpr auto normalizeAngle(T angle) { constexpr F kPi = std::numbers::pi_v; constexpr F k2Pi = 2 * kPi; + if (-kPi <= angle && angle <= kPi) { + return static_cast(angle); + } + F result = std::fmod(static_cast(angle), k2Pi); if (result < -kPi) { result += k2Pi; @@ -61,6 +66,32 @@ constexpr auto absSmallestAngleDiff(T lhs, U rhs) { return std::abs(smallestAngleDiff(lhs, rhs)); } +template +constexpr auto fsin(T radians) { // NOLINT(readability-identifier-naming) + using F = std::conditional_t, T, double>; + + auto index = static_cast(2 * radiansToDegrees(normalizeAngle(radians))); + + // since sin is an odd function, i.e. sin(x) = -sin(-x), we can use the absolute value: + if (index < 0) { + return -angular_internal::kSinTable[-index]; + } + return angular_internal::kSinTable[index]; +} + +template +constexpr auto fcos(T radians) { // NOLINT(readability-identifier-naming) + using F = std::conditional_t, T, double>; + + auto index = static_cast(2 * radiansToDegrees(normalizeAngle(radians))); + + // since cos is an even function, i.e. cos(x) = cos(-x), we can use the absolute value: + if (index < 0) { + return angular_internal::kCosTable[-index]; + } + return angular_internal::kCosTable[index]; +} + } // namespace robocin #endif // ROBOCIN_UTILITY_ANGULAR_H diff --git a/robocin/utility/angular_test.cpp b/robocin/utility/angular_test.cpp index caa1446..f2b62ff 100644 --- a/robocin/utility/angular_test.cpp +++ b/robocin/utility/angular_test.cpp @@ -166,5 +166,37 @@ TYPED_TEST(FloatingPointTest, AbsSmallestAngleDiffGivenAnglesOutsidePiAndMinusPi EXPECT_NEAR((absSmallestAngleDiff(3 * kPi / 2, -5 * kPi / 2)), 0.0, kEpsilon); } +// fsin -------------------------------------------------------------------------------------------- +TYPED_TEST(FloatingPointTest, Fsin) { + using T = TypeParam; + + // the accuracy of standard trigonometric functions is not + // totally defined, and the approach to the floor or ceiling may contain + // inconsistencies, so we use fixed a small epsilon. + static constexpr T kEpsilon = 1e-2; + + for (const T kDegs : std::views::iota(-360, 361)) { // from -pi to pi, stepped 0.5 degrees. + const T kRads = degreesToRadians(kDegs / 2); + + EXPECT_NEAR(fsin(kRads), std::sin(kRads), kEpsilon); + } +} + +// fcos -------------------------------------------------------------------------------------------- +TYPED_TEST(FloatingPointTest, Fcos) { + using T = TypeParam; + + // the accuracy of standard trigonometric functions is not + // totally defined, and the approach to the floor or ceiling may contain + // inconsistencies, so we use fixed a small epsilon. + static constexpr T kEpsilon = 1e-2; + + for (const T kDegs : std::views::iota(-360, 361)) { // from -pi to pi, with step of 0.5. + const T kRads = degreesToRadians(kDegs / 2); + + EXPECT_NEAR(fcos(kRads), std::cos(kRads), kEpsilon); + } +} + } // namespace } // namespace robocin diff --git a/robocin/utility/internal/angular_internal.h b/robocin/utility/internal/angular_internal.h new file mode 100644 index 0000000..dee5a73 --- /dev/null +++ b/robocin/utility/internal/angular_internal.h @@ -0,0 +1,754 @@ +// +// Created by José Cruz on 11/04/23. +// Copyright (c) 2023 RobôCIn. +// + +#ifndef ROBOCIN_UTILITY_ANGULAR_INTERNAL_H +#define ROBOCIN_UTILITY_ANGULAR_INTERNAL_H + +#include +#include +#include +#include + +#include "robocin/utility/concepts.h" + +namespace robocin::angular_internal { + +// A 36 decimal places precision table of sin(x) for x in [0, pi], with step of 0.5. +// Computed in Python using mpmath module, see: https://mpmath.org/ . +template +static constexpr std::array kSinTable = { + F(0.0L), // 0.0 + F(0.008726535498373934817461214212240950L), // 0.5 + F(0.017452406437283512524598660831596487L), // 1.0 + F(0.026176948307873153902594438914211790L), // 1.5 + F(0.034899496702500971056623975309998451L), // 2.0 + F(0.043619387365335997312219221779979685L), // 2.5 + F(0.052335956242943835303427451470562323L), // 3.0 + F(0.061048539534856872738054643396129382L), // 3.5 + F(0.069756473744125299599371034339313839L), // 4.0 + F(0.078459095727844941980781191566487616L), // 4.5 + F(0.087155742747658168633103732612192380L), // 5.0 + F(0.095845752520223982794072443916699965L), // 5.5 + F(0.104528463267653476541216524751014397L), // 6.0 + F(0.113203213767906723990285787019995864L), // 6.5 + F(0.121869343405147482507808714930358024L), // 7.0 + F(0.130526192220051577316657888314114538L), // 7.5 + F(0.139173100960065441776531711569067287L), // 8.0 + F(0.147809411129610627875978000754874119L), // 8.5 + F(0.156434465040230862962258495142185957L), // 9.0 + F(0.165047605860677654174495021046810792L), // 9.5 + F(0.173648177666930339114384495582333491L), // 10.0 + F(0.182235525492147458675358827664875262L), // 10.5 + F(0.190808995376544799004105223273534624L), // 11.0 + F(0.199367934417197179463072154485949319L), // 11.5 + F(0.207911690817759347215206559131764681L), // 12.0 + F(0.216439613938102874467503268519985103L), // 12.5 + F(0.224951054343865004457680906918770171L), // 13.0 + F(0.233445363855905402836671600686511429L), // 13.5 + F(0.241921895599667725287730898765030538L), // 14.0 + F(0.250380004054441430221018857876211853L), // 14.5 + F(0.258819045102520734618030869031751187L), // 15.0 + F(0.267238376078256858687823158689458432L), // 15.5 + F(0.275637355816999181114889202404850719L), // 16.0 + F(0.284015344703922624422476532691692271L), // 16.5 + F(0.292371704722736746528731716845641536L), // 17.0 + F(0.300705799504273098502445720996971371L), // 17.5 + F(0.309016994374947412455210232291895429L), // 18.0 + F(0.317304656405092134139599456859101705L), // 18.5 + F(0.325568154457156679818931195764964682L), // 19.0 + F(0.333806859233770898879908577141466255L), // 19.5 + F(0.342020143325668714461591258445748565L), // 20.0 + F(0.350207381259467453739073453244709654L), // 20.5 + F(0.358367949545300277420272591031361839L), // 21.0 + F(0.366501226724297294558087715439292811L), // 21.5 + F(0.374606593415912010099398473515602783L), // 22.0 + F(0.382683432365089757585633580434144550L), // 22.5 + F(0.390731128489273752012955276055206938L), // 23.0 + F(0.398749068925246214335078081883411601L), // 23.5 + F(0.406736643075800226645019086524669388L), // 24.0 + F(0.414693242656239022992107304979250136L), // 24.5 + F(0.422618261740699426361625414499262095L), // 25.0 + F(0.430511096808295145418231887374660699L), // 25.5 + F(0.438371146789077429272043252130440742L), // 26.0 + F(0.446197813109808770822146277505392625L), // 26.5 + F(0.453990499739546775192884048357469853L), // 27.0 + F(0.461748613235033924909061293167771414L), // 27.5 + F(0.469471562785890780923006438064675458L), // 28.0 + F(0.477158760259608430531153841011107415L), // 28.5 + F(0.484809620246337054975339851749804875L), // 29.0 + F(0.492423560103467156012891638737195265L), // 29.5 + F(0.499999999999999950274367914858819219L), // 30.0 + F(0.507538362960704129801199173809059233L), // 30.5 + F(0.515038074910054181429142831285482589L), // 31.0 + F(0.522498564715948846714694538415830573L), // 31.5 + F(0.529919264233204946044864529292027455L), // 32.0 + F(0.537299608346823833999820798427064555L), // 32.5 + F(0.544639035015027094431417025183750303L), // 33.0 + F(0.551936985312058197922805546980553330L), // 33.5 + F(0.559192903470746862117206476937772503L), // 34.0 + F(0.566406236924832781978612328111243793L), // 34.5 + F(0.573576436351046056392100842598629414L), // 35.0 + F(0.580702955710939731344178945982877451L), // 35.5 + F(0.587785252292473109353504502297240727L), // 36.0 + F(0.594822786751341280523440159106573098L), // 36.5 + F(0.601815023152048279517323490503520550L), // 37.0 + F(0.608761429008720648534868445124161299L), // 37.5 + F(0.615661475325658298178861312166995737L), // 38.0 + F(0.622514636637619578107097165044650383L), // 38.5 + F(0.629320391049837403324922654494797954L), // 39.0 + F(0.636078220277763907025068693319350803L), // 39.5 + F(0.642787609686539296025444196825132941L), // 40.0 + F(0.649448048330183634773674304839582283L), // 40.5 + F(0.656059028990507273040029029266803163L), // 41.0 + F(0.662620048215737474834357153369664199L), // 41.5 + F(0.669130606358858220092724783999455310L), // 42.0 + F(0.675590207615660259409421541461102966L), // 42.5 + F(0.681998360062498524155349767903953979L), // 43.0 + F(0.688354575693753936077099664668564562L), // 43.5 + F(0.694658370458997247375106049474657733L), // 44.0 + F(0.700909264299850869780391612464947862L), // 44.5 + F(0.707106781186547502751942956217516746L), // 45.0 + F(0.713250449154181562084256937459977621L), // 45.5 + F(0.719339800338651134754007891481468727L), // 46.0 + F(0.725374371012287641690247361019672896L), // 46.5 + F(0.731353701619170495131370530579732202L), // 47.0 + F(0.737277336810124061220965377903654374L), // 47.5 + F(0.743144825477394262688346618669940290L), // 48.0 + F(0.748955720789002107290620984865921615L), // 48.5 + F(0.754709580222771967978525499943233476L), // 49.0 + F(0.760405965600030916302621340843390652L), // 49.5 + F(0.766044443118978021265371899247281176L), // 50.0 + F(0.771624583387719961705580248043969666L), // 50.5 + F(0.777145961456970881433106605435550235L), // 51.0 + F(0.782608156852413922604874084988822590L), // 51.5 + F(0.788010753606721972886103377889637062L), // 52.0 + F(0.793353340291235187892906675950551190L), // 52.5 + F(0.798635510047292809735372790073283017L), // 53.0 + F(0.803856860617217297282398473686342802L), // 53.5 + F(0.809016994374947402507413583002918896L), // 54.0 + F(0.814115518356319204097485827632950411L), // 54.5 + F(0.819152044288991782372455366124677227L), // 55.0 + F(0.824126188622015661303459214374948151L), // 55.5 + F(0.829037572555041698293411379335432178L), // 56.0 + F(0.833885822067168197349395119524116913L), // 56.5 + F(0.838670567945424048827613114833097241L), // 57.0 + F(0.843391445812885666997287377388621949L), // 57.5 + F(0.848048096156426001770988929566356461L), // 58.0 + F(0.852640164354092200723407125880040736L), // 58.5 + F(0.857167300702112330325096759018384547L), // 59.0 + F(0.861629160441525737427003589675418161L), // 59.5 + F(0.866025403784438589345509030791826172L), // 60.0 + F(0.870355695939899684444716524846779743L), // 60.5 + F(0.874619707139395756242027089748467621L), // 61.0 + F(0.878817112661965389481513874872853249L), // 61.5 + F(0.882947592858926910646165788556978290L), // 62.0 + F(0.887010833178221726988274130148632878L), // 62.5 + F(0.891006524188367842900479139186611585L), // 63.0 + F(0.894934361602025092324854962529613462L), // 63.5 + F(0.898794046299166984509629580928917198L), // 64.0 + F(0.902585284349860556006228365000095930L), // 64.5 + F(0.906307787036649965406311205253789325L), // 65.0 + F(0.909961270876543169112336039999253874L), // 65.5 + F(0.913545457642600907342699950665493059L), // 66.0 + F(0.917060074385124019116232507804941291L), // 66.5 + F(0.920504853452440348145661565040046731L), // 67.0 + F(0.923879532511286738553731669423169515L), // 67.5 + F(0.927183854566787429686274994937098664L), // 68.0 + F(0.930417567982024524006614861498190077L), // 68.5 + F(0.933580426497201705641976915719647681L), // 69.0 + F(0.936672189248397616970422616634138149L), // 69.5 + F(0.939692620785908350888963608325159384L), // 70.0 + F(0.942641491092178403472681313207357290L), // 70.5 + F(0.945518575599316786589093416963171451L), // 71.0 + F(0.948323655206199342467517963857241483L), // 71.5 + F(0.951056516295153556978972411642780816L), // 72.0 + F(0.953716950748226943405717521886559656L), // 72.5 + F(0.956304755963035474030934512027813345L), // 73.0 + F(0.958819734868193014537082157900264878L), // 73.5 + F(0.961261695938318861639937660228434155L), // 74.0 + F(0.963630453208622964289931307808055986L), // 74.5 + F(0.965925826289068292699454274384237460L), // 75.0 + F(0.968147640378107755928132164335085707L), // 75.5 + F(0.970295726275996483671670584084004175L), // 76.0 + F(0.972369920397676589683400835187035854L), // 76.5 + F(0.974370064785235244504570958916563969L), // 77.0 + F(0.976296007119933359898407867943490433L), // 77.5 + F(0.978147600733805611506546910065779582L), // 78.0 + F(0.979924704620829611070153575160785397L), // 78.5 + F(0.981627183447663933825694006880903995L), // 79.0 + F(0.983254907563954588185912053334129921L), // 79.5 + F(0.984807753012208045631108025807736114L), // 80.0 + F(0.986285601537231415073454608275539625L), // 80.5 + F(0.987688340595137717569076737740309268L), // 81.0 + F(0.989015863361916839847977990171267649L), // 81.5 + F(0.990268068741570310753008227947677240L), // 82.0 + F(0.991444861373810394157289771559530540L), // 82.5 + F(0.992546151641322034111550075095800673L), // 83.0 + F(0.993571855676587484924676707654567529L), // 83.5 + F(0.994521895368273338685531483385060724L), // 84.0 + F(0.995396198367178796947839104867764736L), // 84.5 + F(0.996194698091745535855840877310893335L), // 85.0 + F(0.996917333733127971633751087504741237L), // 85.5 + F(0.997564050259824252136675467583347752L), // 86.0 + F(0.998134798421866971692650456446758007L), // 86.5 + F(0.998629534754573866813021853486904798L), // 87.0 + F(0.999048221581857761959313347760019163L), // 87.5 + F(0.999390827019095726194699555227263121L), // 88.0 + F(0.999657324975557280398083068885673292L), // 88.5 + F(0.999847695156391237669654594332737519L), // 89.0 + F(0.999961923064171289067168734075749663L), // 89.5 + F(1.0L), // 90.0 + F(0.999961923064171288198180983547986077L), // 90.5 + F(0.999847695156391239806957962416532034L), // 91.0 + F(0.999657324975557283603834664553922041L), // 91.5 + F(0.999390827019095730468655248084411188L), // 92.0 + F(0.999048221581857767301147659532736019L), // 92.5 + F(0.998629534754573873222327982810623652L), // 93.0 + F(0.998134798421866979168940309845066053L), // 93.5 + F(0.997564050259824245190331043160670624L), // 94.0 + F(0.996917333733127981242219132214849277L), // 94.5 + F(0.996194698091745527176878550282442912L), // 95.0 + F(0.995396198367178808685558508443934064L), // 95.5 + F(0.994521895368273328276594949750645805L), // 96.0 + F(0.993571855676587498788072047060627764L), // 96.5 + F(0.992546151641322049036240206626139879L), // 97.0 + F(0.991444861373810410142138122277372341L), // 97.5 + F(0.990268068741570327796797489763230745L), // 98.0 + F(0.989015863361916825129127914068634507L), // 98.5 + F(0.987688340595137736726773426525034068L), // 99.0 + F(0.986285601537231398638026393540369814L), // 99.5 + F(0.984807753012208066896876521565453326L), // 100.0 + F(0.983254907563954570038912090614199965L), // 100.5 + F(0.981627183447663957193056550521680617L), // 101.0 + F(0.979924704620829635485683848824774231L), // 101.5 + F(0.978147600733805636968385576594098746L), // 102.0 + F(0.976296007119933386404615909742140528L), // 102.5 + F(0.974370064785235222103961836367471420L), // 103.0 + F(0.972369920397676618272212597379412344L), // 103.5 + F(0.970295726275996459581106361920436560L), // 104.0 + F(0.968147640378107786590839217912386544L), // 104.5 + F(0.965925826289068266926273171838801663L), // 105.0 + F(0.963630453208622997017193495165448466L), // 105.5 + F(0.961261695938318895395778212901239328L), // 106.0 + F(0.958819734868193049318930437939372213L), // 106.5 + F(0.956304755963035509836141747023270722L), // 107.0 + F(0.953716950748226913461456557089943314L), // 107.5 + F(0.951056516295153594822639715984279855L), // 108.0 + F(0.948323655206199310870344073620431464L), // 108.5 + F(0.945518575599316826459693242989972705L), // 109.0 + F(0.942641491092178370232219302786016296L), // 109.5 + F(0.939692620785908392774350985095081822L), // 110.0 + F(0.936672189248397659858457466352489380L), // 110.5 + F(0.933580426497201749529393148484868650L), // 111.0 + F(0.930417567982024568890070280647089504L), // 111.5 + F(0.927183854566787392382978514218141017L), // 112.0 + F(0.923879532511286785418935722686148576L), // 112.5 + F(0.920504853452440309236685090889839268L), // 113.0 + F(0.917060074385124067948909600033950180L), // 113.5 + F(0.913545457642600866839895534237780618L), // 114.0 + F(0.909961270876543219897611264699234437L), // 114.5 + F(0.906307787036650017162121355450369578L), // 115.0 + F(0.902585284349860704321298442009375617L), // 115.5 + F(0.898794046299166940856663656995125901L), // 116.0 + F(0.894934361602025047892510193296790915L), // 116.5 + F(0.891006524188367898498280374120935036L), // 117.0 + F(0.887010833178221783536170251049966422L), // 117.5 + F(0.882947592858926863896222771871498821L), // 118.0 + F(0.878817112661965341966080310215243210L), // 118.5 + F(0.874619707139395815614082052800517996L), // 119.0 + F(0.870355695939899744749210195392301663L), // 119.5 + F(0.866025403784438761600151450675121945L), // 120.0 + F(0.861629160441525686886371466200103349L), // 120.5 + F(0.857167300702112279037643882027980358L), // 121.0 + F(0.852640164354092264711026609727333035L), // 121.5 + F(0.848048096156426066667382004537836325L), // 122.0 + F(0.843391445812885613493032670150489657L), // 122.5 + F(0.838670567945423994592498850356727049L), // 123.0 + F(0.833885822067168203664866435304906800L), // 123.5 + F(0.829037572555041766774791313471919490L), // 124.0 + F(0.824126188622015793551942273608407882L), // 124.5 + F(0.819152044288991725255756846614690743L), // 125.0 + F(0.814115518356319210742108234497121689L), // 125.5 + F(0.809016994374947474490346363602581858L), // 126.0 + F(0.803856860617217436165776001484066755L), // 126.5 + F(0.798635510047292749806677914522761239L), // 127.0 + F(0.793353340291235127272489226101522857L), // 127.5 + F(0.788010753606721979930734361356241895L), // 128.0 + F(0.782608156852413998840929803052656838L), // 128.5 + F(0.777145961456971028371225660133616131L), // 129.0 + F(0.771624583387719898364958772101696880L), // 129.5 + F(0.766044443118978028620390350890712784L), // 130.0 + F(0.760405965600030995837068700848882329L), // 130.5 + F(0.754709580222772121159768440286179747L), // 131.0 + F(0.748955720789002041306966273224062141L), // 131.5 + F(0.743144825477394196056371015360953374L), // 132.0 + F(0.737277336810124068951323536465486172L), // 132.5 + F(0.731353701619170578652081398008010535L), // 133.0 + F(0.725374371012287802412080045327258878L), // 133.5 + F(0.719339800338651065579979453400103418L), // 134.0 + F(0.713250449154181570104325299336464542L), // 134.5 + F(0.707106781186547589347548579766841942L), // 135.0 + F(0.700909264299851036315086664693669444L), // 135.5 + F(0.694658370458997175743302674830479802L), // 136.0 + F(0.688354575693753944377107011957585929L), // 136.5 + F(0.681998360062498532523774872908537756L), // 137.0 + F(0.675590207615660349699854602301439825L), // 137.5 + F(0.669130606358858393607367553985032485L), // 138.0 + F(0.662620048215737400253402641168645322L), // 138.5 + F(0.656059028990507281675700912982016967L), // 139.0 + F(0.649448048330183727896547487302603380L), // 139.5 + F(0.642787609686539474886849587536980301L), // 140.0 + F(0.636078220277763830186750543469304790L), // 140.5 + F(0.629320391049837412217320080953613778L), // 141.0 + F(0.622514636637619587061995092935900935L), // 141.5 + F(0.615661475325658394682346021983553088L), // 142.0 + F(0.608761429008720833772545828636961279L), // 142.5 + F(0.601815023152048199989259289434605935L), // 143.0 + F(0.594822786751341289721473775845105637L), // 143.5 + F(0.587785252292473208429511764006397409L), // 144.0 + F(0.580702955710939921429554633491311947L), // 144.5 + F(0.573576436351045974821001700270161505L), // 145.0 + F(0.566406236924832791408575246583525699L), // 145.5 + F(0.559192903470746871603367304184504749L), // 146.0 + F(0.551936985312058300044365831872227946L), // 146.5 + F(0.544639035015027290250077143376017745L), // 147.0 + F(0.537299608346823750014963870054789664L), // 147.5 + F(0.529919264233204955748550943150129232L), // 148.0 + F(0.522498564715948951132999348487045914L), // 148.5 + F(0.515038074910054381566549264675348750L), // 149.0 + F(0.507538362960704044000231990357628272L), // 149.5 + F(0.499999999999999960183757468171310083L), // 150.0 + F(0.492423560103467165971830029370856584L), // 150.5 + F(0.484809620246337162085362333695450114L), // 151.0 + F(0.477158760259608635723509537941983596L), // 151.5 + F(0.469471562785890692999151353151373018L), // 152.0 + F(0.461748613235033935058574050600832971L), // 152.5 + F(0.453990499739546884309712835026809264L), // 153.0 + F(0.446197813109808979777669793673756750L), // 153.5 + F(0.438371146789077289877107292091676624L), // 154.0 + F(0.430511096808295105642405175071818464L), // 154.5 + F(0.422618261740699487042129829916613882L), // 155.0 + F(0.414693242656239184943220799896228645L), // 155.5 + F(0.406736643075800439945991255940285706L), // 156.0 + F(0.398749068925246123014304644676294566L), // 156.5 + F(0.390731128489273762545719255858175968L), // 157.0 + F(0.382683432365089870728244809204176573L), // 157.5 + F(0.374606593415912226584758785222712750L), // 158.0 + F(0.366501226724297150258625743058040685L), // 158.5 + F(0.358367949545300236278527971188211756L), // 159.0 + F(0.350207381259467516452581743102955323L), // 159.5 + F(0.342020143325668881704166464574342895L), // 160.0 + F(0.333806859233771171301540164722783804L), // 160.5 + F(0.325568154457156585664262341743115281L), // 161.0 + F(0.317304656405092144990676666597051534L), // 161.5 + F(0.309016994374947528926042081201129645L), // 162.0 + F(0.300705799504273321182938593233757004L), // 162.5 + F(0.292371704722736598214397899621985482L), // 163.0 + F(0.284015344703922582168466541907942429L), // 163.5 + F(0.275637355816999245474751733739300230L), // 164.0 + F(0.267238376078257030190753986084188422L), // 164.5 + F(0.258819045102521013768791870829159978L), // 165.0 + F(0.250380004054441333812949430129228333L), // 165.5 + F(0.241921895599667736390220839090595208L), // 166.0 + F(0.233445363855905521917642660904635409L), // 166.5 + F(0.224951054343865204916205041598030957L), // 167.0 + F(0.216439613938102750150362442811723668L), // 167.5 + F(0.207911690817759304109441219884740137L), // 168.0 + F(0.199367934417197245072488972964871887L), // 168.5 + F(0.190808995376544973710019072871808675L), // 169.0 + F(0.182235525492147715543386038725025463L), // 169.5 + F(0.173648177666930268381208356656502861L), // 170.0 + F(0.165047605860677665459947149525335094L), // 170.5 + F(0.156434465040230983919194981641803545L), // 171.0 + F(0.147809411129610831347602879762204449L), // 171.5 + F(0.139173100960065315680251424493393525L), // 172.0 + F(0.130526192220051561143021396629332194L), // 172.5 + F(0.121869343405147548962275948522811695L), // 173.0 + F(0.113203213767906887033483219431270020L), // 173.5 + F(0.104528463267653736352660450685979279L), // 174.0 + F(0.095845752520223911300388106269111129L), // 174.5 + F(0.087155742747658193856918119464986480L), // 175.0 + F(0.078459095727845064067943368645370343L), // 175.5 + F(0.069756473744125518673608643324202054L), // 176.0 + F(0.061048539534856745640060394191059099L), // 176.5 + F(0.052335956242943805153817177245565548L), // 177.0 + F(0.043619387365336071134312596081779877L), // 177.5 + F(0.034899496702501141989370136491416281L), // 178.0 + F(0.026176948307873421992147250117508840L), // 178.5 + F(0.017452406437283437242269924088187349L), // 179.0 + F(0.008726535498373958402004936916250933L), // 179.5 + F(0.0L) // 180.0 +}; + +// A 36 decimal places precision table of cos(x) for x in [0, pi], with step of 0.5. +// Computed in Python using mpmath module, see: https://mpmath.org/ . +template +static constexpr std::array kCosTable = { + F(1.0L), // 0.0 + F(0.999961923064171288738641740762688799L), // 0.5 + F(0.999847695156391239162157666601259369L), // 1.0 + F(0.999657324975557280002929129319450139L), // 1.5 + F(0.999390827019095730026824736084741054L), // 2.0 + F(0.999048221581857762511538396075895123L), // 2.5 + F(0.998629534754573873649211395441952803L), // 3.0 + F(0.998134798421866973736358027862483175L), // 3.5 + F(0.997564050259824247695437714529659169L), // 4.0 + F(0.996917333733127976437985109859797126L), // 4.5 + F(0.996194698091745532725888617881133248L), // 5.0 + F(0.995396198367178805476952838167783909L), // 5.5 + F(0.994521895368273336382310882778700295L), // 6.0 + F(0.993571855676587496569404916858609123L), // 6.5 + F(0.992546151641322034808787588643738051L), // 7.0 + F(0.991444861373810413018202740869724614L), // 7.5 + F(0.990268068741570315412073331496802922L), // 8.0 + F(0.989015863361916828386017664810463002L), // 8.5 + F(0.987688340595137727147925082132673519L), // 9.0 + F(0.986285601537231406855740500907955942L), // 9.5 + F(0.984807753012208061083697399437245943L), // 10.0 + F(0.983254907563954584170463979625335802L), // 10.5 + F(0.981627183447663956101402277333049501L), // 11.0 + F(0.979924704620829612210775153896258244L), // 11.5 + F(0.978147600733805635778883555061100940L), // 12.0 + F(0.976296007119933367144105817966273628L), // 12.5 + F(0.974370064785235227060620398985425178L), // 13.0 + F(0.972369920397676603977806716283225922L), // 13.5 + F(0.970295726275996471626388473002221570L), // 14.0 + F(0.968147640378107771259485691123737941L), // 14.5 + F(0.965925826289068294180206877327291189L), // 15.0 + F(0.963630453208622995488272310762625965L), // 15.5 + F(0.961261695938318863216910992823374163L), // 16.0 + F(0.958819734868193047694025049777092373L), // 16.5 + F(0.956304755963035475703648212921047513L), // 17.0 + F(0.953716950748226928433587039488252667L), // 17.5 + F(0.951056516295153575900806063813532119L), // 18.0 + F(0.948323655206199326668931018738837649L), // 18.5 + F(0.945518575599316806524393329976573850L), // 19.0 + F(0.942641491092178405382453352953738992L), // 19.5 + F(0.939692620785908390817589196997797140L), // 20.0 + F(0.936672189248397618974025138096250963L), // 20.5 + F(0.933580426497201747479102475747199680L), // 21.0 + F(0.930417567982024526103437547938663188L), // 21.5 + F(0.927183854566787411034626754577620990L), // 22.0 + F(0.923879532511286761986333696054660778L), // 22.5 + F(0.920504853452440328691173327964944140L), // 23.0 + F(0.917060074385124043532571053919447454L), // 23.5 + F(0.913545457642600887091297742451637971L), // 24.0 + F(0.909961270876543217525072960020430938L), // 24.5 + F(0.906307787036649967824190039772812975L), // 25.0 + F(0.902585284349860606265596801844799928L), // 25.5 + F(0.898794046299166987017633643790425211L), // 26.0 + F(0.894934361602025070108682577913203298L), // 26.5 + F(0.891006524188367870699379756653774981L), // 27.0 + F(0.887010833178221703997827990372211534L), // 27.5 + F(0.882947592858926939393008121379319626L), // 28.0 + F(0.878817112661965365723797092544049319L), // 28.5 + F(0.874619707139395785928054571274494448L), // 29.0 + F(0.870355695939899659926965930643660890L), // 29.5 + F(0.866025403784438675472830240733486907L), // 30.0 + F(0.861629160441525768504765171891113061L), // 30.5 + F(0.857167300702112304681370320523183515L), // 31.0 + F(0.852640164354092232717216867803688484L), // 31.5 + F(0.848048096156425975386328632639470175L), // 32.0 + F(0.843391445812885699897399654641838257L), // 32.5 + F(0.838670567945424021710055982594913185L), // 33.0 + F(0.833885822067168169868473315632320534L), // 33.5 + F(0.829037572555041670451217682382104721L), // 34.0 + F(0.824126188622015695985838467729641130L), // 34.5 + F(0.819152044288991817493882708307383939L), // 35.0 + F(0.814115518356319239655286625973428779L), // 35.5 + F(0.809016994374947438498879973302751894L), // 36.0 + F(0.803856860617217333704789566433281092L), // 36.5 + F(0.798635510047292846585914879170593093L), // 37.0 + F(0.793353340291235157582697951026038007L), // 37.5 + F(0.788010753606721942232341605561013776L), // 38.0 + F(0.782608156852413891609893667895916327L), // 38.5 + F(0.777145961456970919967866732302750921L), // 39.0 + F(0.771624583387720000654138071569401429L), // 39.5 + F(0.766044443118978060624761335957209554L), // 40.0 + F(0.760405965600030956069845020846137916L), // 40.5 + F(0.754709580222772008150554995190500675L), // 41.0 + F(0.748955720789002147864397039779309488L), // 41.5 + F(0.743144825477394229372358817015447753L), // 42.0 + F(0.737277336810124027583354271874781426L), // 42.5 + F(0.731353701619170461174697754495509663L), // 43.0 + F(0.725374371012287683839808751109184050L), // 43.5 + F(0.719339800338651177289565385657832962L), // 44.0 + F(0.713250449154181605002571288336906503L), // 44.5 + F(0.707106781186547546049745767992180670L), // 45.0 + F(0.700909264299850913454385589818970541L), // 45.5 + F(0.694658370458997291421965248675920697L), // 46.0 + F(0.688354575693753980493469746854699268L), // 46.5 + F(0.681998360062498487741276386284261259L), // 47.0 + F(0.675590207615660222700410585789656998L), // 47.5 + F(0.669130606358858183091571787585245222L), // 48.0 + F(0.662620048215737520694668461737174949L), // 48.5 + F(0.656059028990507319252662614549816994L), // 49.0 + F(0.649448048330183681335110896071094049L), // 49.5 + F(0.642787609686539342932137960338788770L), // 50.0 + F(0.636078220277763954273447502778410046L), // 50.5 + F(0.629320391049837450911388362923383772L), // 51.0 + F(0.622514636637619539141066379139980893L), // 51.5 + F(0.615661475325658258943835436434894160L), // 52.0 + F(0.608761429008720609033835378689643797L), // 52.5 + F(0.601815023152048328419644543745069573L), // 53.0 + F(0.594822786751341329745476725482333705L), // 53.5 + F(0.587785252292473158891508133151820170L), // 54.0 + F(0.580702955710939781194377130545606688L), // 54.5 + F(0.573576436351046106550697295274864168L), // 55.0 + F(0.566406236924832832441787277584210499L), // 55.5 + F(0.559192903470746820839456824063336424L), // 56.0 + F(0.551936985312058156403661732681736794L), // 56.5 + F(0.544639035015027052674040893009913498L), // 57.0 + F(0.537299608346823885642652525577505274L), // 57.5 + F(0.529919264233204903820581619101435837L), // 58.0 + F(0.522498564715948898923846943451439223L), // 58.5 + F(0.515038074910054138750815068688393496L), // 59.0 + F(0.507538362960704182560768843145845954L), // 59.5 + F(0.500000000000000099451264170282356616L), // 60.0 + F(0.492423560103467112677914171747601404L), // 60.5 + F(0.484809620246337108530351092722628403L), // 61.0 + F(0.477158760259608386774882752689429827L), // 61.5 + F(0.469471562785890834987953608541937979L), // 62.0 + F(0.461748613235033880744825167564028888L), // 62.5 + F(0.453990499739546829751298441692140410L), // 63.0 + F(0.446197813109808726263397968772006126L), // 63.5 + F(0.438371146789077434414213616911873128L), // 64.0 + F(0.430511096808295250789189077855638115L), // 64.5 + F(0.422618261740699431546783308078894285L), // 65.0 + F(0.414693242656239129224162913545419389L), // 65.5 + F(0.406736643075800181159625003751304700L), // 66.0 + F(0.398749068925246270488812317962199293L), // 66.5 + F(0.390731128489273706181053136851452405L), // 67.0 + F(0.382683432365089814156939194819161279L), // 67.5 + F(0.374606593415911963934949119256665362L), // 68.0 + F(0.366501226724297299881182215952579568L), // 68.5 + F(0.358367949545300386409710885680654687L), // 69.0 + F(0.350207381259467459097951822433256949L), // 69.5 + F(0.342020143325668824164588453181832560L), // 70.0 + F(0.333806859233770904272938448741398819L), // 70.5 + F(0.325568154457156737715246052868364068L), // 71.0 + F(0.317304656405092086922600221397541462L), // 71.5 + F(0.309016994374947470690626156746513116L), // 72.0 + F(0.300705799504273051016914502718675024L), // 72.5 + F(0.292371704722736751999931705386574079L), // 73.0 + F(0.284015344703922736358439801756809948L), // 73.5 + F(0.275637355816999186614448780048377727L), // 74.0 + F(0.267238376078256971185406481941518855L), // 74.5 + F(0.258819045102520740144274816655092535L), // 75.0 + F(0.250380004054441489502964302431834513L), // 75.5 + F(0.241921895599667676976743068577823542L), // 76.0 + F(0.233445363855905462377157130795573857L), // 76.5 + F(0.224951054343864928899629904371445009L), // 77.0 + F(0.216439613938102907150734626654486573L), // 77.5 + F(0.207911690817759461407572366573961353L), // 78.0 + F(0.199367934417197185069406326999146732L), // 78.5 + F(0.190808995376544913602689664611143787L), // 79.0 + F(0.182235525492147437009939783382377799L), // 79.5 + F(0.173648177666930426750373676265164627L), // 80.0 + F(0.165047605860677605067371901140722962L), // 80.5 + F(0.156434465040230923440726738391995045L), // 81.0 + F(0.147809411129610551182210666370265882L), // 81.5 + F(0.139173100960065474927502483979361020L), // 82.0 + F(0.130526192220051720579515144703086233L), // 82.5 + F(0.121869343405147488186352567844389214L), // 83.0 + F(0.113203213767906826194753580569829613L), // 83.5 + F(0.104528463267653454627536312108664455L), // 84.0 + F(0.095845752520224071372305305896955734L), // 84.5 + F(0.087155742747658132857585702183985008L), // 85.0 + F(0.078459095727845003024362280105929127L), // 85.5 + F(0.069756473744125236086712161209297318L), // 86.0 + F(0.061048539534856906152378071453876171L), // 86.5 + F(0.052335956242943965745694524732773925L), // 87.0 + F(0.043619387365336009960252258377892244L), // 87.5 + F(0.034899496702501080794331266183331016L), // 88.0 + F(0.026176948307873138812274301730177944L), // 88.5 + F(0.017452406437283598030042404885565937L), // 89.0 + F(0.008726535498373897171996519427790589L), // 89.5 + F(0.0L), // 90.0 + F(-0.008726535498373996748129831309336021L), // 90.5 + F(-0.017452406437283475584014454072258983L), // 91.0 + F(-0.026176948307873016389559974178011783L), // 91.5 + F(-0.034899496702500958404253525567160094L), // 92.0 + F(-0.043619387365335887612131582970116486L), // 92.5 + F(-0.052335956242943843448848197612836391L), // 93.0 + F(-0.061048539534856783916119470961078479L), // 93.5 + F(-0.069756473744125335424065479049736361L), // 94.0 + F(-0.078459095727844880937200103027045811L), // 94.5 + F(-0.087155742747658232058579033814459166L), // 95.0 + F(-0.095845752520223949471428484516021738L), // 95.5 + F(-0.104528463267653553661952073978758232L), // 96.0 + F(-0.113203213767906704517294302846947524L), // 96.5 + F(-0.121869343405147366634505806487542881L), // 97.0 + F(-0.130526192220051599162537543450266054L), // 97.5 + F(-0.139173100960065353654640415759841423L), // 98.0 + F(-0.147809411129610649668336173943089715L), // 98.5 + F(-0.156434465040230802483790251892376283L), // 99.0 + F(-0.165047605860677703281618140952898212L), // 99.5 + F(-0.173648177666930306146207426075389088L), // 100.0 + F(-0.182235525492147534922389744606490543L), // 100.5 + F(-0.190808995376544793388030848089811864L), // 101.0 + F(-0.199367934417197065063241035067694178L), // 101.5 + F(-0.207911690817759341619039533342134796L), // 102.0 + F(-0.216439613938102787588956612677693264L), // 102.5 + F(-0.224951054343865025927327887962415445L), // 103.0 + F(-0.233445363855905343296186070577448126L), // 103.5 + F(-0.241921895599667773598718728952236933L), // 104.0 + F(-0.250380004054441370939073413320588254L), // 104.5 + F(-0.258819045102520836331096164028703157L), // 105.0 + F(-0.267238376078256853174711473656176714L), // 105.5 + F(-0.275637355816999068893842872666529621L), // 106.0 + F(-0.284015344703922618936887875192168170L), // 106.5 + F(-0.292371704722736634886375865434361908L), // 107.0 + F(-0.300705799504273145987976939275266973L), // 107.5 + F(-0.309016994374947354219794307837276582L), // 108.0 + F(-0.317304656405092181356598692320661161L), // 108.5 + F(-0.325568154457156621922616338661564074L), // 109.0 + F(-0.333806859233770998141107443294118375L), // 109.5 + F(-0.342020143325668709085432430396808044L), // 110.0 + F(-0.350207381259467344388691981093856263L), // 110.5 + F(-0.358367949545300272079082780038762668L), // 111.0 + F(-0.366501226724297185937892565987456055L), // 111.5 + F(-0.374606593415912056263847827774539274L), // 112.0 + F(-0.382683432365089701014327966049126386L), // 112.5 + F(-0.390731128489273797844857415258960502L), // 113.0 + F(-0.398749068925246158181343845804622414L), // 113.5 + F(-0.406736643075800272130413169298033069L), // 114.0 + F(-0.414693242656239017786047140843796214L), // 114.5 + F(-0.422618261740699320556090264403450337L), // 115.0 + F(-0.430511096808294939840178259587748176L), // 115.5 + F(-0.438371146789077523916057347083421673L), // 116.0 + F(-0.446197813109808815380894586238778017L), // 116.5 + F(-0.453990499739546720634469655022797594L), // 117.0 + F(-0.461748613235033772117327401490415529L), // 117.5 + F(-0.469471562785890922911808693455232900L), // 118.0 + F(-0.477158760259608474287424929332783821L), // 118.5 + F(-0.484809620246337001420328610776979529L), // 119.0 + F(-0.492423560103467006090082456501085507L), // 119.5 + F(-0.499999999999999801097471659435266987L), // 120.0 + F(-0.507538362960704268361736026597268788L), // 120.5 + F(-0.515038074910054224107470593882570405L), // 121.0 + F(-0.522498564715948794505542133380219964L), // 121.5 + F(-0.529919264233204799964642971004043088L), // 122.0 + F(-0.537299608346823969627509453949771561L), // 122.5 + F(-0.544639035015027136188793157357585758L), // 123.0 + F(-0.551936985312058146862025404534712918L), // 123.5 + F(-0.559192903470746719311635863820993482L), // 124.0 + F(-0.566406236924832640019050398164614031L), // 124.5 + F(-0.573576436351046188121796437603322891L), // 125.0 + F(-0.580702955710939771878960079803136077L), // 125.5 + F(-0.587785252292473059815500871442659080L), // 126.0 + F(-0.594822786751341142055364076717811683L), // 126.5 + F(-0.601815023152048407947708744813974550L), // 127.0 + F(-0.608761429008720688035901511558677292L), // 127.5 + F(-0.615661475325658249927118957258713600L), // 128.0 + F(-0.622514636637619443299208951548133807L), // 128.5 + F(-0.629320391049837269457922955667843488L), // 129.0 + F(-0.636078220277764031111765652628445874L), // 129.5 + F(-0.642787609686539334166768296996025923L), // 130.0 + F(-0.649448048330183588212237713608068083L), // 130.5 + F(-0.656059028990507143037800157132962094L), // 131.0 + F(-0.662620048215737595275622973938183216L), // 131.5 + F(-0.669130606358858257093877780413663739L), // 132.0 + F(-0.675590207615660214264205011040930737L), // 132.5 + F(-0.681998360062498398176279413035700594L), // 133.0 + F(-0.688354575693753811127996765399167773L), // 133.5 + F(-0.694658370458997363053768623320087505L), // 134.0 + F(-0.700909264299850905293104732631615699L), // 134.5 + F(-0.707106781186547459454140144442850172L), // 135.0 + F(-0.713250449154181441349382246705663350L), // 135.5 + F(-0.719339800338651246463593823739186751L), // 136.0 + F(-0.725374371012287675963395875058740208L), // 136.5 + F(-0.731353701619170453371015096865588922L), // 137.0 + F(-0.737277336810123944847415742693363642L), // 137.5 + F(-0.743144825477394073139072722025441235L), // 138.0 + F(-0.748955720789002213848051751421156968L), // 138.5 + F(-0.754709580222772000643679954544393542L), // 139.0 + F(-0.760405965600030876535397660840640537L), // 139.5 + F(-0.766044443118977910542222040760912027L), // 140.0 + F(-0.771624583387720063994759547511661858L), // 140.5 + F(-0.777145961456970912766945279532029925L), // 141.0 + F(-0.782608156852413884486846225956901065L), // 141.5 + F(-0.788010753606721866835556093970548676L), // 142.0 + F(-0.793353340291235015444828904116739808L), // 142.5 + F(-0.798635510047292906514609754721102082L), // 143.0 + F(-0.803856860617217326898602723243268278L), // 143.5 + F(-0.809016994374947366515947192703082866L), // 144.0 + F(-0.814115518356319104068705839475669983L), // 144.5 + F(-0.819152044288991874610581227817357306L), // 145.0 + F(-0.824126188622015689504804513544345754L), // 145.5 + F(-0.829037572555041664052721412267183859L), // 146.0 + F(-0.833885822067168102275687076287138620L), // 146.5 + F(-0.838670567945423894543931212078284177L), // 147.0 + F(-0.843391445812885753401654361879957042L), // 147.5 + F(-0.848048096156425969322792392080611759L), // 148.0 + F(-0.852640164354092168729597383956389792L), // 148.5 + F(-0.857167300702112184426684400386073616L), // 149.0 + F(-0.861629160441525819045397295366414076L), // 149.5 + F(-0.866025403784438669751641514623655579L), // 150.0 + F(-0.870355695939899654292469689574013888L), // 150.5 + F(-0.874619707139395726555999608222437515L), // 151.0 + F(-0.878817112661965254313438044657910423L), // 151.5 + F(-0.882947592858926986142951138064784957L), // 152.0 + F(-0.887010833178221698714326069697961118L), // 152.5 + F(-0.891006524188367815101578521719444848L), // 153.0 + F(-0.894934361602024965927301651575335812L), // 153.5 + F(-0.898794046299167055005086592552601892L), // 154.0 + F(-0.902585284349860625237692936455156488L), // 154.5 + F(-0.906307787036649939528406130155494102L), // 155.0 + F(-0.909961270876543143719698427649258475L), // 155.5 + F(-0.913545457642600792123586328430027063L), // 156.0 + F(-0.917060074385124083239973435420808108L), // 156.5 + F(-0.920504853452440324220280273458933838L), // 157.0 + F(-0.923879532511286715121129642791674789L), // 157.5 + F(-0.927183854566787323568863679274528305L), // 158.0 + F(-0.930417567982024582944507244459645146L), // 158.5 + F(-0.933580426497201763271938573916799130L), // 159.0 + F(-0.936672189248397595526405191774957266L), // 159.5 + F(-0.939692620785908329946269919940192881L), // 160.0 + F(-0.942641491092178308912894048675688362L), // 160.5 + F(-0.945518575599316838944445736560693633L), // 161.0 + F(-0.948323655206199323038211372804903665L), // 161.5 + F(-0.951056516295153538057138759472025947L), // 162.0 + F(-0.953716950748226858222697329896849719L), // 162.5 + F(-0.956304755963035521047890560948061067L), // 163.0 + F(-0.958819734868193060210233025309802286L), // 163.5 + F(-0.961261695938318844762017383892026162L), // 164.0 + F(-0.963630453208622947926300214129354327L), // 164.5 + F(-0.965925826289068219381985900362298715L), // 165.0 + F(-0.968147640378107796192307718942616787L), // 165.5 + F(-0.970295726275996468858226829594344054L), // 166.0 + F(-0.972369920397676575388994954090842140L), // 166.5 + F(-0.974370064785235180781123536311964700L), // 167.0 + F(-0.976296007119933394704552414056508833L), // 167.5 + F(-0.978147600733805644941296823726262783L), // 168.0 + F(-0.979924704620829598862388438328785469L), // 168.5 + F(-0.981627183447663922142012735060510163L), // 169.0 + F(-0.983254907563954536562789142880029081L), // 169.5 + F(-0.984807753012208073555864783934072518L), // 170.0 + F(-0.986285601537231404967203497064899869L), // 170.5 + F(-0.987688340595137707990228393347941313L), // 171.0 + F(-0.989015863361916797976979580508691432L), // 171.5 + F(-0.990268068741570333133749815909117795L), // 172.0 + F(-0.991444861373810415147502380070672587L), // 172.5 + F(-0.992546151641322026649205009330625488L), // 173.0 + F(-0.993571855676587477992979037951531824L), // 173.5 + F(-0.994521895368273309075027755672088139L), // 174.0 + F(-0.995396198367178812361011655175141216L), // 174.5 + F(-0.996194698091745530519090808149407829L), // 175.0 + F(-0.996917333733127966829517065149681610L), // 175.5 + F(-0.997564050259824232376274699578232525L), // 176.0 + F(-0.998134798421866981510004372015043641L), // 176.5 + F(-0.998629534754573875229285516163247446L), // 177.0 + F(-0.999048221581857759288396191873655116L), // 177.5 + F(-0.999390827019095724057721708798683467L), // 178.0 + F(-0.999657324975557272982757125886847136L), // 178.5 + F(-0.999847695156391240476215602648533301L), // 179.0 + F(-0.999961923064171288532822545789280508L), // 179.5 + F(-1.0L), // 180.0 +}; + +} // namespace robocin::angular_internal + +#endif // ROBOCIN_UTILITY_ANGULAR_INTERNAL_H