2
0
mirror of https://github.com/boostorg/math.git synced 2026-01-19 04:22:09 +00:00
Files
math/example/formatter_html_output.cpp
2019-11-16 18:20:52 +00:00

228 lines
13 KiB
C++

// (C) Copyright John Maddock 2019.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/math/tools/formatting.hpp>
#include <complex>
#include <fstream>
#include <boost/math/tools/polynomial.hpp>
#include <boost/rational.hpp>
#include <boost/multiprecision/cpp_int.hpp>
void print(std::ostream& os)
{
boost::math::tools::html_printer printer(os);
printer << "<!DOCTYPE html>\n<html>\n<body>" << std::endl;
printer << "<style> span.number { font-weight:bold; } span.integer { color:red; } span.float { color:blue; } span.complex { color:green; } span.polynomial { color:Olive; } span.rational {color:gray; } td { text-align:right; } th { text-align:right; } </style>" << std::endl;
printer << "<h2>Synopsis</h2>\n<para>Sample HTML output for various number types, these are then styled in bold, and various (somewhat untasteful!) colors just because we can, and to check that our markup generation is working correctly.</para>\n";
printer << "<h2>Basic Integers Values:</h2>\n" << boost::math::tools::full_styling;
int ival = 0;
printer << "<table style=\"width:90%\"><tr><th>Value</th><th>Base</th><th>Result</th></tr>";
printer.stream() << "<tr><td>" << ival << "</td><td>default</td><td>";
printer << ival << "</td></tr>\n";
ival = -23;
printer.stream() << "<tr><td>" << ival << "</td><td>default</td><td>";
printer << ival << "</td></tr>\n";
ival = 23;
printer.stream() << std::dec << "<tr><td>" << ival << "</td><td>hex</td><td>";
printer << std::hex << ival << "</td></tr>\n";
printer.stream() << std::dec << "<tr><td>" << ival << "</td><td>oct</td><td>";
printer << std::oct << ival << "</td></tr>\n</table>\n\n" << std::dec;
printer << "<h2>Basic Floating Point Values:</h2>\n\n";
double fval = 3;
printer << "<table style=\"width:90%\"><tr><th>Value</th><th>Precision</th><th>Format</th><th>Result</th></tr>";
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>default</td><td>";
printer << fval << "</td></tr>\n";
fval = 3.14;
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>default</td><td>";
printer << fval << "</td></tr>\n";
fval = -1.2345678765e-24;
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>default</td><td>";
printer << fval << "</td></tr>\n";
printer.stream() << "<tr><td>" << fval << "</td><td>3</td><td>scientific</td><td>";
printer << std::setprecision(3) << std::scientific << fval << "</td></tr>\n";
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>multiply_x</td><td>";
printer << boost::math::tools::multiply_x << fval << "</td></tr>\n";
printer.stream() << "<tr><td>" << fval << "</td><td>3</td><td>scientific + multiply_x</td><td>";
printer << std::setprecision(3) << std::scientific << fval << "</td></tr>\n";
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>multiply_dot</td><td>";
printer << boost::math::tools::multiply_dot << fval << "</td></tr>\n";
printer.stream() << "<tr><td>" << fval << "</td><td>3</td><td>scientific + multiply_dot</td><td>";
printer << std::setprecision(3) << std::scientific << fval << "</td></tr>\n" << boost::math::tools::multiply_times << std::defaultfloat;
// Infinities:
fval = std::numeric_limits<double>::infinity();
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>default</td><td>";
printer << fval << "</td></tr>\n";
fval = -std::numeric_limits<double>::infinity();
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>default</td><td>";
printer << fval << "</td></tr>\n";
// NaN's:
fval = std::numeric_limits<double>::quiet_NaN();
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>default</td><td>";
printer << fval << "</td></tr>\n";
// Zeros:
fval = 0;
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>default</td><td>";
printer << fval << "</td></tr>\n";
fval = -fval;
printer.stream() << "<tr><td>" << fval << "</td><td>default</td><td>default</td><td>";
printer << fval << "</td></tr>\n";
printer << "</table>\n\n" << std::defaultfloat;
printer << "<h2>Complex Values:</h2>\n\n";
std::complex<double> cval(3.25, 4.67);
printer << "<table style=\"width:90%\"><tr><th>Value</th><th>Precision</th><th>Format</th><th>Result</th></tr>";
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = 3.14;
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(1.23, -1.2345678765e-24);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>3</td><td>scientific</td><td>";
printer << std::scientific << std::setprecision(3) << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>12</td><td>default + slanted_i</td><td>";
printer << boost::math::tools::slanted_i << std::defaultfloat << std::setprecision(12) << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>12</td><td>default + doublestruck_i</td><td>";
printer << boost::math::tools::doublestruck_i << std::defaultfloat << std::setprecision(12) << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>12</td><td>default + doublestruck_i + multiply_x</td><td>";
printer << boost::math::tools::doublestruck_i << boost::math::tools::multiply_x << std::defaultfloat << std::setprecision(12) << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>12</td><td>default + doublestruck_i + multiply_dot</td><td>";
printer << boost::math::tools::doublestruck_i << std::defaultfloat << std::setprecision(12) << boost::math::tools::multiply_dot << cval << "</td></tr>\n" << boost::math::tools::multiply_times << boost::math::tools::upright_i;
printer << "\n</table>\n\n";
printer << "<h2>Complex Special Values:</h2>\n\n";
printer << "<table style=\"width:90%\"><tr><th>Value</th><th>Precision</th><th>Format</th><th>Result</th></tr>";
cval = std::complex<double>(0, 0);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>show_zero_components</td><td>";
printer << boost::math::tools::show_zero_components << cval << boost::math::tools::hide_zero_components << "</td></tr>\n";
cval = std::complex<double>(3.14, 0);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>show_zero_components</td><td>";
printer << boost::math::tools::show_zero_components << cval << boost::math::tools::hide_zero_components << "</td></tr>\n";
cval = std::complex<double>(-3.14, 0);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>show_zero_components</td><td>";
printer << boost::math::tools::show_zero_components << cval << boost::math::tools::hide_zero_components << "</td></tr>\n";
cval = std::complex<double>(0, 25.5);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>show_zero_components</td><td>";
printer << boost::math::tools::show_zero_components << cval << boost::math::tools::hide_zero_components << "</td></tr>\n";
cval = std::complex<double>(0, -25.5);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>show_zero_components</td><td>";
printer << boost::math::tools::show_zero_components << cval << boost::math::tools::hide_zero_components << "</td></tr>\n";
cval = std::complex<double>(std::numeric_limits<double>::infinity(), 0);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(-std::numeric_limits<double>::infinity(), 0);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(25.5, std::numeric_limits<double>::infinity());
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(25.5, -std::numeric_limits<double>::infinity());
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(std::numeric_limits<double>::quiet_NaN(), 0);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(-std::numeric_limits<double>::quiet_NaN(), 0);
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(25.5, std::numeric_limits<double>::quiet_NaN());
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(25.5, -std::numeric_limits<double>::quiet_NaN());
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::infinity());
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(-std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::infinity());
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN());
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
cval = std::complex<double>(std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::quiet_NaN());
printer.stream() << "<tr><td>" << cval << "</td><td>default</td><td>default</td><td>";
printer << cval << "</td></tr>\n";
printer << "\n</table>\n\n";
printer << "<h2>Rationals:</h2>\n\n";
printer << "<table style=\"width:90%\"><tr><th>Value</th><th>Result</th></tr>";
boost::rational<int> rat(1, 3);
printer.stream() << "<tr><td>" << rat << "</td><td>";
printer << rat << "</td></tr>\n";
rat = -rat;
printer.stream() << "<tr><td>" << rat;
printer << "</td><td>" << rat << "</td></tr>\n";
rat *= 345634;
rat /= 565;
printer.stream() << "<tr><td>" << rat;
printer << "</td><td>" << rat << "</td></tr>\n";
rat = 0;
printer.stream() << "<tr><td>" << rat;
printer << "</td><td>" << rat << "</td></tr>\n";
rat = -23;
printer.stream() << "<tr><td>" << rat;
printer << "</td><td>" << rat << "</td></tr>\n";
boost::multiprecision::cpp_rational rat2(1);
for (unsigned i = 1; i < 20; i += 2)
{
rat2 *= i;
rat2 /= i + 1;
}
printer.stream() << "<tr><td>" << rat2;
printer << "</td><td>" << rat2 << "</td></tr>\n";
printer << "\n</table>\n\n";
printer << "<h2>Polynomials:</h2>\n\n";
printer << "<table style=\"width:90%\"><tr><th>Type</th><th>Result</th></tr>";
boost::math::tools::polynomial<int> poly1 = { 2, -3, 4, 5 };
printer << "<tr><td>Integer</td><td>" << poly1 << "</td></tr>\n";
boost::math::tools::polynomial<double> poly2 = { 2.4, -34.25, 4.2e-6, -5.34e-67 };
printer << "<tr><td>Float</td><td>" << poly2 << "</td></tr>\n";
boost::math::tools::polynomial<std::complex<double> > poly3 = { { 2.4, 3.25 }, {-34.25 }, { 0, 4.2e-6 }, { -5.34e-67, 4.65e-20 } };
printer << "<tr><td>Complex</td><td>" << poly3 << "</td></tr>\n";
boost::math::tools::polynomial<boost::rational<int>> poly4 = { {2, 3}, {-3, 23}, {4, 56}, {5, 32} };
printer << "<tr><td>Polynomial</td><td>" << poly4 << "</td></tr>\n";
printer << "\n</table>\n\n";
printer << "</body></html>\n\n";
}
int main(int argc, const char* argv[])
{
if (argc > 1)
{
std::ofstream ofs(argv[1]);
print(ofs);
}
else
print(std::cout);
return 0;
}