Skip to content

Commit c2eb37c

Browse files
committed
Using calculus to improve accuracy of atan.
1 parent a52d32f commit c2eb37c

File tree

3 files changed

+28
-31
lines changed

3 files changed

+28
-31
lines changed

Steppable.sln

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ VisualStudioVersion = 17.11.35017.193
44
MinimumVisualStudioVersion = 10.0.40219.1
55
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calc", "calc.vcxproj", "{0A900AAA-AC12-48CF-85CF-8BB0C0130512}"
66
EndProject
7-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "add", "src\add\add.vcxproj", "{50F5EB82-9639-40D9-A6A1-62BE499E4528}"
7+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "add", "src\calc\add\add.vcxproj", "{50F5EB82-9639-40D9-A6A1-62BE499E4528}"
88
EndProject
99
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "util", "util.vcxproj", "{F6AF63F8-9E0F-4DA2-89B3-3096B56BA251}"
1010
EndProject
11-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "subtract", "src\subtract\subtract.vcxproj", "{8F1DF35F-1D30-4703-8B94-B1A3753D60C4}"
11+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "subtract", "src\calc\subtract\subtract.vcxproj", "{8F1DF35F-1D30-4703-8B94-B1A3753D60C4}"
1212
EndProject
13-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "comparison", "src\comparison\comparison.vcxproj", "{7666B097-5666-4F12-863A-F7BAACFEDB4E}"
13+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "comparison", "src\calc\comparison\comparison.vcxproj", "{7666B097-5666-4F12-863A-F7BAACFEDB4E}"
1414
EndProject
15-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multiply", "src\multiply\multiply.vcxproj", "{D2D485AA-9E2E-4D6E-8D8A-0C82A6538BFA}"
15+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multiply", "src\calc\multiply\multiply.vcxproj", "{D2D485AA-9E2E-4D6E-8D8A-0C82A6538BFA}"
1616
EndProject
17-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "division", "src\division\division.vcxproj", "{348481F3-C3A4-4D76-A801-54888CB569C4}"
17+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "division", "src\calc\division\division.vcxproj", "{348481F3-C3A4-4D76-A801-54888CB569C4}"
1818
EndProject
19-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "power", "src\power\power.vcxproj", "{0C2C224A-06F4-44F2-847F-B3870608F1EF}"
19+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "power", "src\calc\power\power.vcxproj", "{0C2C224A-06F4-44F2-847F-B3870608F1EF}"
2020
EndProject
2121
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testAdd", "tests\testAdd.vcxproj", "{C11E7406-C105-44A5-91DD-71FD0ED96D2A}"
2222
EndProject
@@ -51,7 +51,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
5151
README.md = README.md
5252
EndProjectSection
5353
EndProject
54-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "abs", "src\abs\abs.vcxproj", "{B0C1EC9C-06CC-47B2-9B93-CD046FC0EF34}"
54+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "abs", "src\calc\abs\abs.vcxproj", "{B0C1EC9C-06CC-47B2-9B93-CD046FC0EF34}"
5555
EndProject
5656
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "base", "base.vcxproj", "{867A7B37-C961-4581-AE5B-067FD464CC7C}"
5757
EndProject
@@ -67,15 +67,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testDecimalConvert", "tests
6767
EndProject
6868
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "base Source", "base Source", "{254B33CA-1687-41C5-9060-FBF4EF09FECD}"
6969
EndProject
70-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "baseConvert", "src\baseConvert\baseConvert.vcxproj", "{00B3E92A-8C55-4D70-8A27-8F0AEBF5872D}"
70+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "baseConvert", "src\base\baseConvert\baseConvert.vcxproj", "{00B3E92A-8C55-4D70-8A27-8F0AEBF5872D}"
7171
EndProject
72-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "decimalConvert", "src\decimalConvert\decimalConvert.vcxproj", "{55A00CFD-37B4-4618-A8D3-445A05DA759A}"
72+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "decimalConvert", "src\base\decimalConvert\decimalConvert.vcxproj", "{55A00CFD-37B4-4618-A8D3-445A05DA759A}"
7373
EndProject
74-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "factorial", "src\factorial\factorial.vcxproj", "{C6B85BA3-8B2A-4778-BAB9-CF7BE46F12DB}"
74+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "factorial", "src\calc\factorial\factorial.vcxproj", "{C6B85BA3-8B2A-4778-BAB9-CF7BE46F12DB}"
7575
EndProject
76-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "root", "src\root\root.vcxproj", "{127594DF-529C-426F-AE9B-C46EC403CDBA}"
76+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "root", "src\calc\root\root.vcxproj", "{127594DF-529C-426F-AE9B-C46EC403CDBA}"
7777
EndProject
78-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "trig", "src\trig\trig.vcxproj", "{2B7A46CF-F3C3-4EAE-91EB-96B8DB2A2CD2}"
78+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "trig", "src\calc\trig\trig.vcxproj", "{2B7A46CF-F3C3-4EAE-91EB-96B8DB2A2CD2}"
7979
EndProject
8080
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testRoot", "tests\testRoot.vcxproj", "{09060239-6270-4BE5-BB4E-FDD22EA3C49D}"
8181
EndProject

src/calc/trig/trig.cpp

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "argParse.hpp"
3232
#include "constants.hpp"
3333
#include "fn/basicArithm.hpp"
34+
#include "fn/calculus.hpp"
3435
#include "getString.hpp"
3536
#include "rounding.hpp"
3637
#include "trigReport.hpp"
@@ -304,25 +305,18 @@ namespace steppable::__internals::arithmetic
304305
// Reduce x to a small number
305306
x = divide("1", x, 0, decimals * 2);
306307
}
307-
// Otherwise, use Padé series.
308-
// (https://journalofinequalitiesandapplications.springeropen.com/articles/10.1186/s13660-017-1310-6/tables/1)
309-
// 3
310-
// 55x + 105x
311-
// ------------------ ~= arctan(x)
312-
// 4 2
313-
// 9x + 90x + 105
314-
//
315-
// 1
316-
// d ---------
317-
// ---- arctan(x) = 2
318-
// dx x + 1
319-
auto x2 = power(x, "2", 0);
320-
auto x3 = multiply(x2, x, 0); // Use multiply to reduce the number of operations.
321-
auto x4 = multiply(x3, x, 0);
322-
auto numerator = add(multiply("55", x3, 0), multiply("105", x, 0), 0);
323-
auto denominator = add(add(x4, multiply("90", x2, 0), 0), "105", 0);
324-
auto result = standardizeNumber(divide(numerator, denominator, 0, decimals * 2));
325-
308+
// Otherwise, use integration.
309+
// 1 / x
310+
// d --------- ==> | 1
311+
// ---- arctan(x) = 2 arctan(x) = | ---------- dt
312+
// dx x + 1 | 2
313+
// / 0 t + 1
314+
auto fx = [&](const std::string& y) {
315+
const auto& y2 = power(y, "2", 0);
316+
const auto& denominator = add(y2, "1", 0);
317+
return divide("1", denominator, 0, decimals + 1);
318+
};
319+
auto result = calculus::romberg(fx, "0", x, 10, decimals + 1);
326320
if (isReduced)
327321
{
328322
// If x was reduced, use the identity
@@ -346,6 +340,8 @@ namespace steppable::__internals::arithmetic
346340
break;
347341
}
348342

343+
if (_x.front() == '-')
344+
result = "-" + result;
349345
return result;
350346
}
351347

tests/testTrig.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ SECTION_END()
5858

5959
SECTION(Test arc tangent)
6060
_.assertIsEqual(atan("0", 2, 1), "0");
61+
_.assertIsEqual(atan("1", 20, 0), "0.78539816339744830962");
6162
SECTION_END()
6263

6364
TEST_END()

0 commit comments

Comments
 (0)