/*
Command-line interface to the Lambert W function
Copyright (C) 2011 Darko Veberic, darko.veberic@ung.si
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/*
This source implements an utility "lambert-w" so that the
numerical implementation of the Lambert W function can be
easily obtained from the command line or be used in shell
scripts.
Usage:
lambert-w [branch] x
- "branch" value is optional (default 0 is assumed) and can
be only 0 or -1
- x value for W(x); note that the definition range for
branch 0 is [-1/e, infinity] and for branch -1 it is
[-1/e, 0) where 1/e is approx. 0.367879
Examples:
./lambert-w 3.14 --> 1.073395661239825
./lambert-w -0.2 --> -0.2591711018190738
./lambert-w 0 1 --> 0.5671432904097838
./lambert-w -1 -0.2 --> -2.542641357773526
./lambert-w -1 -0.3 --> -1.781337023421628
*/
#include "LambertW.h"
#include
#include
#include
#include
using namespace std;
void
Usage(const int argc, const char* const name)
{
cout << "Usage: " << name << " [branch] x\n"
"You gave " << argc << " parameters." << endl;
exit(1);
}
int
main(int argc, char* argv[])
{
int branch = 0;
double x = 0;
switch (argc) {
case 3:
{
stringstream ss;
ss << argv[argc-2];
if (!(ss >> branch) || !(branch == -1 || branch == 0))
Usage(argc, argv[0]);
}
case 2:
{
stringstream ss;
ss << argv[argc-1];
if (!(ss >> x))
Usage(argc, argv[0]);
}
break;
default:
Usage(argc, argv[0]);
break;
}
cout << setprecision(16) << LambertW(branch, x) << endl;
return 0;
}