add trigonometric chord of a unit circle functions

Improve builtin function strings, as printed by help builtin,
that use an optional accuracy (epsilon) arg by adding a comma.

Added the following new trigonometric functions:

    crd(x [,eps])		trigonometric chord of a unit circle
    acrd(x [,eps])		inverse trigonometric chord of a unit circle
This commit is contained in:
Landon Curt Noll
2023-10-02 22:43:33 -07:00
parent c78a893862
commit 26fc394089
44 changed files with 1246 additions and 118 deletions

51
CHANGES
View File

@@ -1,5 +1,30 @@
The following are the changes from calc version 2.14.3.5 to date: The following are the changes from calc version 2.14.3.5 to date:
Added the following new trigonometric functions:
versin(x [,eps]) versed trigonometric sine
coversin(x [,eps]) coversed trigonometric sine
vercos(x [,eps]) versed trigonometric cosine
covercos(x [,eps]) coversed trigonometric cosine
aversin(x [,eps]) inverse versed trigonometric sine
acoversin(x [,eps]) inverse coversed trigonometric sine
avercos(x [,eps]) inverse versed trigonometric cosine
acovercos(x [,eps]) inverse coversed trigonometric cosine
haversin(x [,eps]) half versed trigonometric sine
hacoversin(x [,eps]) half coversed trigonometric sine
havercos(x [,eps]) half versed trigonometric cosine
hacovercos(x [,eps]) half coversed trigonometric cosine
ahaversin(x [,eps]) inverse half versed trigonometric sine
ahacoversin(x [,eps]) inverse half coversed trigonometric sine
ahavercos(x [,eps]) inverse half versed trigonometric cosine
ahacovercos(x [,eps]) inverse half coversed trigonometric cosine
exsec(x [,eps]) exterior trigonometric secant
aexsec(x [,eps]) inverse exterior trigonometric secant
excsc(x [,eps]) exterior trigonometric cosecant
aexcsc(x [,eps]) inverse exterior trigonometric cosecant
crd(x [,eps]) trigonometric chord of a unit circle
acrd(x [,eps]) inverse trigonometric chord of a unit circle
As Msys2 is a fork of Cygwin, if the OSNAME is Msys, the Cygwin As Msys2 is a fork of Cygwin, if the OSNAME is Msys, the Cygwin
target will be used. Thanks to GitHub user @iahung2 for the target will be used. Thanks to GitHub user @iahung2 for the
pull request. pull request.
@@ -336,29 +361,6 @@ The following are the changes from calc version 2.14.3.5 to date:
Fixed SEE ALSO typo in help randperm. Fixed SEE ALSO typo in help randperm.
Added the following new trigonometric functions:
versin(x [,eps]) versed trigonometric sine
coversin(x [,eps]) coversed trigonometric sine
vercos(x [,eps]) versed trigonometric cosine
covercos(x [,eps]) coversed trigonometric cosine
aversin(x [,eps]) inverse versed trigonometric sine
acoversin(x [,eps]) inverse coversed trigonometric sine
avercos(x [,eps]) inverse versed trigonometric cosine
acovercos(x [,eps]) inverse coversed trigonometric cosine
haversin(x [,eps]) half versed trigonometric sine
hacoversin(x [,eps]) half coversed trigonometric sine
havercos(x [,eps]) half versed trigonometric cosine
hacovercos(x [,eps]) half coversed trigonometric cosine
ahaversin(x [,eps]) inverse half versed trigonometric sine
ahacoversin(x [,eps]) inverse half coversed trigonometric sine
ahavercos(x [,eps]) inverse half versed trigonometric cosine
ahacovercos(x [,eps]) inverse half coversed trigonometric cosine
exsec(x [,eps]) exterior trigonometric secant
aexsec(x [,eps]) inverse exterior trigonometric secant
excsc(x [,eps]) exterior trigonometric cosecant
aexcsc(x [,eps]) inverse exterior trigonometric cosecant
Fixed calc regression test 42dd to set the display value back to 20. Fixed calc regression test 42dd to set the display value back to 20.
Added to test 95dd and test9500.trigeq.cal to the calc regression test Added to test 95dd and test9500.trigeq.cal to the calc regression test
@@ -366,6 +368,9 @@ The following are the changes from calc version 2.14.3.5 to date:
Added to test 34dd, some if the missing inverse trigonometric tests. Added to test 34dd, some if the missing inverse trigonometric tests.
Improve builtin function strings, as printed by help builtin,
that use an optional accuracy (epsilon) arg by adding a comma.
The following are the changes from calc version 2.14.3.4 to 2.14.3.5: The following are the changes from calc version 2.14.3.4 to 2.14.3.5:

View File

@@ -4138,6 +4138,50 @@ define test_trig()
strcat(str(tnum++), strcat(str(tnum++),
': round(aexcsc(2 + 3i, 1e-10), 10) == 0.1650861985-0.1681700706i')); ': round(aexcsc(2 + 3i, 1e-10), 10) == 0.1650861985-0.1681700706i'));
/* test trigonometric chord of a unit circle */
vrfy(crd(0, 1e-10) == 0,
strcat(str(tnum++), ': crd(0, 1e-10) == 0'));
vrfy(round(crd(0.2, 1e-10), 10) == 0.1996668332,
strcat(str(tnum++),
': round(crd(0.2, 1e-10), 10) == 0.1996668332'));
vrfy(round(crd(3/7, 1e-10), 10) == 0.4252990674,
strcat(str(tnum++),
': round(crd(3/7, 1e-10), 10) == 0.4252990674'));
vrfy(round(crd(-31, 1e-10), 10) == -0.4129349638,
strcat(str(tnum++),
': round(crd(-31, 1e-10), 10) == -0.4129349638'));
vrfy(crd(pi/3, 1e-10) == 1,
strcat(str(tnum++), ': crd(pi/3, 1e-10) == 1'));
vrfy(crd(pi, 1e-10) == 2,
strcat(str(tnum++), ': crd(pi, 1e-10) == 2'));
vrfy(crd(5*pi/3, 1e-10) == 1,
strcat(str(tnum++), ': crd(5*pi/3, 1e-10) == 1'));
vrfy(round(crd(1, 1e-10), 10) == 0.9588510772,
strcat(str(tnum++),
': round(crd(1, 1e-10), 10) == 0.9588510772'));
vrfy(round(crd(2 + 3i, 1e-10), 10) == 3.9589688712+2.3009091988i,
strcat(str(tnum++),
': round(crd(2 + 3i, 1e-10), 10) == 3.9589688712+2.3009091988i'));
/* test inverse trigonometric chord of a unit circle */
vrfy(acrd(0, 1e-10) == 0,
strcat(str(tnum++), ': acrd(0, 1e-10) == 0'));
vrfy(round(acrd(0.2, 1e-10), 10) == 0.2003348424,
strcat(str(tnum++),
': round(acrd(0.2, 1e-10), 10) == 0.2003348424'));
vrfy(round(acrd(3/7, 1e-10), 10) == 0.4319209974,
strcat(str(tnum++),
': round(acrd(3/7, 1e-10), 10) == 0.4319209974'));
vrfy(round(acrd(-31, 1e-10), 10) == -3.1415926536+6.8658899902i,
strcat(str(tnum++),
': round(acrd(-31, 1e-10), 10) == -3.1415926536+6.8658899902i'));
vrfy(round(acrd(1, 1e-10), 10) == 1.0471975512,
strcat(str(tnum++),
': round(acrd(1, 1e-10), 10) == 1.0471975512'));
vrfy(round(acrd(2 + 3i, 1e-10), 10) == 1.0471975512+2.6339157938i,
strcat(str(tnum++),
': round(acrd(2 + 3i, 1e-10), 10) == 1.0471975512+2.6339157938i'));
print strcat(str(tnum++), ': Ending test_trig'); print strcat(str(tnum++), ': Ending test_trig');
} }
print '051: parsed test_trig()'; print '051: parsed test_trig()';
@@ -9835,8 +9879,9 @@ vrfy(verify_havercos(9513) == 0, '9513: verify_havercos(9513) == 0');
vrfy(verify_hacovercos(9514) == 0, '9514: verify_hacovercos(9514) == 0'); vrfy(verify_hacovercos(9514) == 0, '9514: verify_hacovercos(9514) == 0');
vrfy(verify_exsec(9515) == 0, '9515: verify_exsec(9515) == 0'); vrfy(verify_exsec(9515) == 0, '9515: verify_exsec(9515) == 0');
vrfy(verify_excsc(9516) == 0, '9516: verify_excsc(9516) == 0'); vrfy(verify_excsc(9516) == 0, '9516: verify_excsc(9516) == 0');
vrfy(verify_crd(9517) == 0, '9516: verify_excsc(9517) == 0');
print '9517: Ending trigonometric identities test set'; print '9518: Ending trigonometric identities test set';
/* /*
@@ -10839,6 +10884,12 @@ vrfy_errsym(10590, 10590, "E_EXCSC_4");
vrfy_errsym(10591, 10591, "E_AEXCSC_1"); vrfy_errsym(10591, 10591, "E_AEXCSC_1");
vrfy_errsym(10592, 10592, "E_AEXCSC_2"); vrfy_errsym(10592, 10592, "E_AEXCSC_2");
vrfy_errsym(10593, 10593, "E_AEXCSC_3"); vrfy_errsym(10593, 10593, "E_AEXCSC_3");
vrfy_errsym(10594, 10594, "E_CRD_1");
vrfy_errsym(10595, 10595, "E_CRD_2");
vrfy_errsym(10596, 10596, "E_CRD_3");
vrfy_errsym(10597, 10597, "E_ACRD_1");
vrfy_errsym(10598, 10598, "E_ACRD_2");
vrfy_errsym(10599, 10599, "E_ACRD_3");
/* ************************************************************** */ /* ************************************************************** */
/* NOTE: Reserve thru test 10998 for calc computation error codes */ /* NOTE: Reserve thru test 10998 for calc computation error codes */

View File

@@ -364,6 +364,16 @@ define compare(ident_val, trig_val, name, index, testnum)
{ {
local abs_diff; /* absolute difference between ident_val and trig_val */ local abs_diff; /* absolute difference between ident_val and trig_val */
/*
* firewall
*/
if (!isnum(trig_val)) {
printf("**** trig test %d-%d failed: %s(tval[%d]): ",
testnum, index, name, index);
printf("%d returned a non-numeric value\n", trig_val);
return 1;
}
/* /*
* compute absolute difference * compute absolute difference
*/ */
@@ -1244,3 +1254,61 @@ define verify_excsc(testnum)
} }
return error_count; return error_count;
} }
/*
* verify_crd - verify trigonometric chord of a unit circle
*
* We use the following trigonometric identity:
*
* crd(x) = 2 * sin(x / 2)
*
* given:
* testnum regression test number being performed
*
* returns:
* number of tests that failed
*/
define verify_crd(testnum)
{
local tval_len; /* current length of the tval[] array */
local ident_val; /* computed trig value trigonometric identity */
local trig_val; /* computed value from the trigonometric function */
local error_count; /* number of compare errors detected */
local i;
/*
* firewall
*/
if (size(sin_tval) <= 0) {
precompute_trig();
}
/*
* for each test value, verify the trigonometric identity within epsilon
*/
tval_len = size(tval);
for (i=0; i < tval_len; ++i) {
/* NOTE: We actually check the identity: crd(x*2) = 2 * sin(x) */
/* compute trigonometric identity */
ident_val = 2 * sin_tval[i];
/* compute trigonometric function */
trig_val = crd(tval[i] * 2);
/* compare trigonometric identity with trigonometric function value */
if (compare(ident_val, trig_val, "crd", i, testnum)) {
++error_count;
}
}
/*
* report test results
*/
if (error_count != 0) {
print '**** test', testnum : ': crd test failure count:', error_count;
}
return error_count;
}

View File

@@ -148,6 +148,8 @@ E_FUNC COMPLEX *c_exsec(COMPLEX *c, NUMBER *epsilon);
E_FUNC COMPLEX *c_aexsec(COMPLEX *c, NUMBER *epsilon); E_FUNC COMPLEX *c_aexsec(COMPLEX *c, NUMBER *epsilon);
E_FUNC COMPLEX *c_excsc(COMPLEX *c, NUMBER *epsilon); E_FUNC COMPLEX *c_excsc(COMPLEX *c, NUMBER *epsilon);
E_FUNC COMPLEX *c_aexcsc(COMPLEX *c, NUMBER *epsilon); E_FUNC COMPLEX *c_aexcsc(COMPLEX *c, NUMBER *epsilon);
E_FUNC COMPLEX *c_crd(COMPLEX *c, NUMBER *epsilon);
E_FUNC COMPLEX *c_acrd(COMPLEX *c, NUMBER *epsilon);

142
comfunc.c
View File

@@ -1655,7 +1655,7 @@ c_ilog(COMPLEX *c, ZVALUE base)
* versin(x) = 1 - cos(x) * versin(x) = 1 - cos(x)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -1705,7 +1705,7 @@ c_versin(COMPLEX *c, NUMBER *epsilon)
* aversin(x) = acos(1 - x) * aversin(x) = acos(1 - x)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -1751,7 +1751,7 @@ c_aversin(COMPLEX *c, NUMBER *epsilon)
* coversin(x) = 1 - cos(x) * coversin(x) = 1 - cos(x)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -1801,7 +1801,7 @@ c_coversin(COMPLEX *c, NUMBER *epsilon)
* acoversin(x) = asin(1 - x) * acoversin(x) = asin(1 - x)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -1847,7 +1847,7 @@ c_acoversin(COMPLEX *c, NUMBER *epsilon)
* vercos(x) = 1 + cos(x) * vercos(x) = 1 + cos(x)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -1897,7 +1897,7 @@ c_vercos(COMPLEX *c, NUMBER *epsilon)
* avercos(x) = acos(x - 1) * avercos(x) = acos(x - 1)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -1943,7 +1943,7 @@ c_avercos(COMPLEX *c, NUMBER *epsilon)
* covercos(x) = 1 + sin(x) * covercos(x) = 1 + sin(x)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -1993,7 +1993,7 @@ c_covercos(COMPLEX *c, NUMBER *epsilon)
* acovercos(x) = asin(x - 1) * acovercos(x) = asin(x - 1)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2039,7 +2039,7 @@ c_acovercos(COMPLEX *c, NUMBER *epsilon)
* haversin(x) = versin(x) / 2 * haversin(x) = versin(x) / 2
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2089,7 +2089,7 @@ c_haversin(COMPLEX *c, NUMBER *epsilon)
* ahaversin(x) = acos(1 - 2*x) * ahaversin(x) = acos(1 - 2*x)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2138,7 +2138,7 @@ c_ahaversin(COMPLEX *c, NUMBER *epsilon)
* hacoversin(x) = coversin(x) / 2 * hacoversin(x) = coversin(x) / 2
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2188,7 +2188,7 @@ c_hacoversin(COMPLEX *c, NUMBER *epsilon)
* ahacoversin(x) = asin(1 - 2*x) * ahacoversin(x) = asin(1 - 2*x)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2237,7 +2237,7 @@ c_ahacoversin(COMPLEX *c, NUMBER *epsilon)
* havercos(x) = vercos(x) / 2 * havercos(x) = vercos(x) / 2
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2287,7 +2287,7 @@ c_havercos(COMPLEX *c, NUMBER *epsilon)
* ahavercos(x) = acos(2*x - 1) * ahavercos(x) = acos(2*x - 1)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2336,7 +2336,7 @@ c_ahavercos(COMPLEX *c, NUMBER *epsilon)
* hacovercos(x) = covercos(x) / 2 * hacovercos(x) = covercos(x) / 2
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2386,7 +2386,7 @@ c_hacovercos(COMPLEX *c, NUMBER *epsilon)
* ahacovercos(x) = asin(2*x - 1) * ahacovercos(x) = asin(2*x - 1)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2435,7 +2435,7 @@ c_ahacovercos(COMPLEX *c, NUMBER *epsilon)
* exsec(x) = sec(x) - 1 * exsec(x) = sec(x) - 1
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2485,7 +2485,7 @@ c_exsec(COMPLEX *c, NUMBER *epsilon)
* aexsec(x) = asec(x + 1) * aexsec(x) = asec(x + 1)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2531,7 +2531,7 @@ c_aexsec(COMPLEX *c, NUMBER *epsilon)
* excsc(x) = csc(x) - 1 * excsc(x) = csc(x) - 1
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2581,7 +2581,7 @@ c_excsc(COMPLEX *c, NUMBER *epsilon)
* aexcsc(x) = acsc(x + 1) * aexcsc(x) = acsc(x + 1)
* *
* given: * given:
* q complex value to pass to the trig function * c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation * epsilon error tolerance / precision for trig calculation
* *
* returns: * returns:
@@ -2617,3 +2617,105 @@ c_aexcsc(COMPLEX *c, NUMBER *epsilon)
*/ */
return r; return r;
} }
/*
* c_crd - COMPLEX valued trigonometric chord of a unit circle
*
* This uses the formula:
*
* crd(x) = 2 * sin(x / 2)
*
* given:
* c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation
*
* returns:
* complex value result of trig function on q with error epsilon
*/
COMPLEX *
c_crd(COMPLEX *c, NUMBER *epsilon)
{
COMPLEX *r; /* return COMPLEX value */
COMPLEX *cdiv2; /* complex c/2 */
COMPLEX *ctmp; /* complex sin(c/2) */
/*
* firewall
*/
if (c == NULL) {
math_error("%s: c is NULL", __func__);
not_reached();
}
if (check_epsilon(epsilon) == false) {
math_error("Invalid epsilon arg for %s", __func__);
not_reached();
}
/*
* calculate complex trig function value
*/
cdiv2 = c_divq(c, &_qtwo_);
ctmp = c_sin(cdiv2, epsilon);
comfree(cdiv2);
if (ctmp == NULL) {
math_error("Failed to compute complex sine for complex crd");
not_reached();
}
r = c_mulq(ctmp, &_qtwo_);
comfree(ctmp);
/*
* return trigonometric result
*/
return r;
}
/*
* c_acrd - COMPLEX valued inverse trigonometric chord of a unit circle
*
* This uses the formula:
*
* acrd(x) = 2 * asin(x / 2)
*
* given:
* c complex value to pass to the trig function
* epsilon error tolerance / precision for trig calculation
*
* returns:
* complex value result of trig function on q with error epsilon
*/
COMPLEX *
c_acrd(COMPLEX *c, NUMBER *epsilon)
{
COMPLEX *r; /* inverse trig value result */
COMPLEX *cdiv2; /* complex c/2 */
COMPLEX *ctmp; /* complex asin(c/2) */
/*
* firewall
*/
if (c == NULL) {
math_error("%s: c is NULL", __func__);
not_reached();
}
if (check_epsilon(epsilon) == false) {
math_error("Invalid epsilon arg for %s", __func__);
not_reached();
}
/*
* calculate complex inverse trig function value
*/
cdiv2 = c_divq(c, &_qtwo_);
ctmp = c_asin(cdiv2, epsilon);
comfree(cdiv2);
r = c_mulq(ctmp, &_qtwo_);
comfree(ctmp);
/*
* return inverse trigonometric result
*/
return r;
}

View File

@@ -145,7 +145,8 @@
* Do not remove such computation error codes, nor change their errnum values, * Do not remove such computation error codes, nor change their errnum values,
* not change their E_STRING errsym codes. * not change their E_STRING errsym codes.
*/ */
CONST struct errtbl error_table[] = { CONST struct errtbl error_table[] =
{
/* The E__BASE entry below must start with 10000 and must be first!! */ /* The E__BASE entry below must start with 10000 and must be first!! */
{ 10000, "E__BASE", "No error" }, { 10000, "E__BASE", "No error" },
@@ -742,6 +743,12 @@ CONST struct errtbl error_table[] = {
{ 10591, "E_AEXCSC_1", "Bad epsilon for aexcsc" }, { 10591, "E_AEXCSC_1", "Bad epsilon for aexcsc" },
{ 10592, "E_AEXCSC_2", "Bad argument for aexcsc" }, { 10592, "E_AEXCSC_2", "Bad argument for aexcsc" },
{ 10593, "E_AEXCSC_3", "Invalid value for calculating aexcsc" }, { 10593, "E_AEXCSC_3", "Invalid value for calculating aexcsc" },
{ 10594, "E_CRD_1", "Bad epsilon for crd" },
{ 10595, "E_CRD_2", "Bad argument for crd" },
{ 10596, "E_CRD_3", "Invalid complex argument for crd" },
{ 10597, "E_ACRD_1", "Bad epsilon for acrd" },
{ 10598, "E_ACRD_2", "Bad argument for acrd" },
{ 10599, "E_ACRD_3", "Invalid value for calculating acrd" },
/* IMPORTANT NOTE: add new entries above here and be sure their errnum numeric value is consecutive! */ /* IMPORTANT NOTE: add new entries above here and be sure their errnum numeric value is consecutive! */
/* The next NULL entry must be last */ /* The next NULL entry must be last */

252
func.c
View File

@@ -12219,6 +12219,142 @@ f_aexcsc(int count, VALUE **vals)
} }
/*
* f_crd - exterior trigonometric cosecant
*/
S_FUNC VALUE
f_crd(int count, VALUE **vals)
{
VALUE result;
COMPLEX *c;
NUMBER *err;
/* initialize VALUEs */
result.v_subtype = V_NOSUBTYPE;
/*
* set error tolerance for builtin function
*
* Use err VALUE arg if given and value is in a valid range.
*/
err = conf->epsilon;
if (count == 2) {
if (verify_eps(vals[1]) == false) {
return error_value(E_CRD_1);
}
err = vals[1]->v_num;
}
/*
* compute cosecant to a given error tolerance
*/
switch (vals[0]->v_type) {
case V_NUM:
result.v_num = qcrd(vals[0]->v_num, err);
result.v_type = V_NUM;
break;
case V_COM:
c = c_crd(vals[0]->v_com, err);
if (c == NULL) {
return error_value(E_CRD_3);
}
result.v_com = c;
result.v_type = V_COM;
if (cisreal(c)) {
result.v_num = c_to_q(c, true);
result.v_type = V_NUM;
}
break;
default:
return error_value(E_CRD_2);
}
return result;
}
/*
* f_acrd - exterior trigonometric cosecant
*/
S_FUNC VALUE
f_acrd(int count, VALUE **vals)
{
VALUE arg1; /* 1st arg if it is a COMPLEX value */
VALUE result; /* value to return */
COMPLEX *c; /* COMPLEX trig result */
NUMBER *eps; /* epsilon error tolerance */
/* initialize VALUE */
result.v_subtype = V_NOSUBTYPE;
/*
* set error tolerance for builtin function
*
* Use eps VALUE arg if given and value is in a valid range.
*/
eps = conf->epsilon;
if (count == 2) {
if (verify_eps(vals[1]) == false) {
return error_value(E_ACRD_1);
}
eps = vals[1]->v_num;
}
/*
* compute inverse trig function to a given error tolerance
*/
arg1 = *vals[0];
if (arg1.v_type == V_NUM) {
/* try to compute result using real trig function */
result.v_num = qacrd_or_NULL(arg1.v_num, eps);
/*
* case: trig function returned a NUMBER
*/
if (result.v_num != NULL) {
result.v_type = V_NUM;
/*
* case: trig function returned NULL - need to try COMPLEX trig function
*/
} else {
/* convert NUMBER argument from NUMBER to COMPLEX */
arg1.v_com = qqtoc(arg1.v_num, &_qzero_);
arg1.v_type = V_COM;
}
}
if (arg1.v_type == V_COM) {
/*
* case: argument was COMPLEX or
* trig function returned NULL and argument was converted to COMPLEX
*/
c = c_acrd(arg1.v_com, eps);
if (c == NULL) {
return error_value(E_ACRD_3);
}
result.v_com = c;
result.v_type = V_COM;
/*
* case: complex trig function returned real, convert result to NUMBER
*/
if (cisreal(c)) {
result.v_num = c_to_q(c, true);
result.v_type = V_NUM;
}
}
if (arg1.v_type != V_NUM && arg1.v_type != V_COM) {
/*
* case: argument type is not valid for this function
*/
return error_value(E_ACRD_2);
}
return result;
}
#endif /* !FUNCLIST */ #endif /* !FUNCLIST */
@@ -12260,39 +12396,41 @@ f_aexcsc(int count, VALUE **vals)
*/ */
STATIC CONST struct builtin builtins[] = { STATIC CONST struct builtin builtins[] = {
{"abs", 1, 2, 0, OP_ABS, {.null = NULL}, {.null = NULL}, {"abs", 1, 2, 0, OP_ABS, {.null = NULL}, {.null = NULL},
"absolute value within accuracy b"}, "absolute value, within accuracy b"},
{"access", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_access}, {"access", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_access},
"determine accessibility of file a for mode b"}, "determine accessibility of file a for mode b"},
{"acos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acos}, {"acos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acos},
"inverse cosine of a within accuracy b"}, "inverse cosine of a, within accuracy b"},
{"acosh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acosh}, {"acosh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acosh},
"inverse hyperbolic cosine of a within accuracy b"}, "inverse hyperbolic cosine of a, within accuracy b"},
{"acot", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acot}, {"acot", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acot},
"inverse cotangent of a within accuracy b"}, "inverse cotangent of a, within accuracy b"},
{"acoth", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acoth}, {"acoth", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acoth},
"inverse hyperbolic cotangent of a within accuracy b"}, "inverse hyperbolic cotangent of a, within accuracy b"},
{"acovercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acovercos}, {"acovercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acovercos},
"inverse coversed cosine of a within accuracy b"}, "inverse coversed cosine of a, within accuracy b"},
{"acoversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acoversin}, {"acoversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acoversin},
"inverse coversed sine of a within accuracy b"}, "inverse coversed sine of a, within accuracy b"},
{"acrd", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acrd},
"angle of unit circle chord with length a, within accuracy b"},
{"acsc", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acsc}, {"acsc", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acsc},
"inverse cosecant of a within accuracy b"}, "inverse cosecant of a, within accuracy b"},
{"acsch", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acsch}, {"acsch", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_acsch},
"inverse csch of a within accuracy b"}, "inverse csch of a, within accuracy b"},
{"aexcsc", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_aexcsc}, {"aexcsc", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_aexcsc},
"inverse exterior cosecant of a within accuracy b"}, "inverse exterior cosecant of a, within accuracy b"},
{"aexsec", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_aexsec}, {"aexsec", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_aexsec},
"inverse exterior secant of a within accuracy b"}, "inverse exterior secant of a, within accuracy b"},
{"agd", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_agd}, {"agd", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_agd},
"inverse Gudermannian function"}, "inverse Gudermannian function"},
{"ahacovercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ahacovercos}, {"ahacovercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ahacovercos},
"inverse half coversed cosine of a within accuracy b"}, "inverse half coversed cosine of a, within accuracy b"},
{"ahacoversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ahacoversin}, {"ahacoversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ahacoversin},
"inverse half coversed sine of a within accuracy b"}, "inverse half coversed sine of a, within accuracy b"},
{"ahavercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ahavercos}, {"ahavercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ahavercos},
"inverse half versed cosine of a within accuracy b"}, "inverse half versed cosine of a, within accuracy b"},
{"ahaversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ahaversin}, {"ahaversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ahaversin},
"inverse half versed sine of a within accuracy b"}, "inverse half versed sine of a, within accuracy b"},
{"append", 1, IN, FA, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_listappend}, {"append", 1, IN, FA, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_listappend},
"append values to end of list"}, "append values to end of list"},
{"appr", 1, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_appr}, {"appr", 1, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_appr},
@@ -12302,25 +12440,25 @@ STATIC CONST struct builtin builtins[] = {
{"argv", 0, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_argv}, {"argv", 0, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_argv},
"calc argc or argv string"}, "calc argc or argv string"},
{"asec", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_asec}, {"asec", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_asec},
"inverse secant of a within accuracy b"}, "inverse secant of a, within accuracy b"},
{"asech", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_asech}, {"asech", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_asech},
"inverse hyperbolic secant of a within accuracy b"}, "inverse hyperbolic secant of a, within accuracy b"},
{"asin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_asin}, {"asin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_asin},
"inverse sine of a within accuracy b"}, "inverse sine of a, within accuracy b"},
{"asinh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_asinh}, {"asinh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_asinh},
"inverse hyperbolic sine of a within accuracy b"}, "inverse hyperbolic sine of a, within accuracy b"},
{"assoc", 0, 0, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_assoc}, {"assoc", 0, 0, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_assoc},
"create new association array"}, "create new association array"},
{"atan", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_atan}, {"atan", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_atan},
"inverse tangent of a within accuracy b"}, "inverse tangent of a, within accuracy b"},
{"atan2", 2, 3, FE, OP_NOP, {.numfunc_3 = qatan2}, {.null = NULL}, {"atan2", 2, 3, FE, OP_NOP, {.numfunc_3 = qatan2}, {.null = NULL},
"angle to point (b,a) within accuracy c"}, "angle to point (b,a) within accuracy c"},
{"atanh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_atanh}, {"atanh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_atanh},
"inverse hyperbolic tangent of a within accuracy b"}, "inverse hyperbolic tangent of a, within accuracy b"},
{"avercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_avercos}, {"avercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_avercos},
"inverse versed cosine of a within accuracy b"}, "inverse versed cosine of a, within accuracy b"},
{"aversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_aversin}, {"aversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_aversin},
"inverse versed sine of a within accuracy b"}, "inverse versed sine of a, within accuracy b"},
{"avg", 0, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_avg}, {"avg", 0, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_avg},
"arithmetic mean of values"}, "arithmetic mean of values"},
{"base", 0, 1, 0, OP_NOP, {.numfunc_cnt = f_base}, {.null = NULL}, {"base", 0, 1, 0, OP_NOP, {.numfunc_cnt = f_base}, {.null = NULL},
@@ -12354,7 +12492,7 @@ STATIC CONST struct builtin builtins[] = {
{"ceil", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_ceil}, {"ceil", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_ceil},
"smallest integer greater than or equal to number"}, "smallest integer greater than or equal to number"},
{"cfappr", 1, 3, 0, OP_NOP, {.numfunc_cnt = f_cfappr}, {.null = NULL}, {"cfappr", 1, 3, 0, OP_NOP, {.numfunc_cnt = f_cfappr}, {.null = NULL},
"approximate a within accuracy b using\n" "approximate a, within accuracy b using\n"
"\t\t\tcontinued fractions"}, "\t\t\tcontinued fractions"},
{"cfsim", 1, 2, 0, OP_NOP, {.numfunc_cnt = f_cfsim}, {.null = NULL}, {"cfsim", 1, 2, 0, OP_NOP, {.numfunc_cnt = f_cfsim}, {.null = NULL},
"simplify number using continued fractions"}, "simplify number using continued fractions"},
@@ -12373,25 +12511,27 @@ STATIC CONST struct builtin builtins[] = {
{"copy", 2, 5, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_copy}, {"copy", 2, 5, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_copy},
"copy value to/from a block: copy(s,d,len,si,di)"}, "copy value to/from a block: copy(s,d,len,si,di)"},
{"cos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_cos}, {"cos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_cos},
"cosine of value a within accuracy b"}, "cosine of value a, within accuracy b"},
{"cosh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_cosh}, {"cosh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_cosh},
"hyperbolic cosine of a within accuracy b"}, "hyperbolic cosine of a, within accuracy b"},
{"cot", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_cot}, {"cot", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_cot},
"cotangent of a within accuracy b"}, "cotangent of a, within accuracy b"},
{"coth", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_coth}, {"coth", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_coth},
"hyperbolic cotangent of a within accuracy b"}, "hyperbolic cotangent of a, within accuracy b"},
{"count", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_count}, {"count", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_count},
"count listr/matrix elements satisfying some condition"}, "count listr/matrix elements satisfying some condition"},
{"covercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_covercos}, {"covercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_covercos},
"coversed cosine of value a within accuracy b"}, "coversed cosine of value a, within accuracy b"},
{"coversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_coversin}, {"coversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_coversin},
"coversed sine of value a within accuracy b"}, "coversed sine of value a, within accuracy b"},
{"cp", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_cp}, {"cp", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_cp},
"cross product of two vectors"}, "cross product of two vectors"},
{"crd", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_crd},
"length of unit circle chord with angle a, within accuracy b"},
{"csc", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_csc}, {"csc", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_csc},
"cosecant of a within accuracy b"}, "cosecant of a, within accuracy b"},
{"csch", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_csch}, {"csch", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_csch},
"hyperbolic cosecant of a within accuracy b"}, "hyperbolic cosecant of a, within accuracy b"},
{"ctime", 0, 0, 0, OP_NOP, {.null = NULL}, {.valfunc_0 = f_ctime}, {"ctime", 0, 0, 0, OP_NOP, {.null = NULL}, {.valfunc_0 = f_ctime},
"date and time as string"}, "date and time as string"},
{"custom", 0, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_custom}, {"custom", 0, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_custom},
@@ -12441,11 +12581,11 @@ STATIC CONST struct builtin builtins[] = {
{"eval", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_eval}, {"eval", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_eval},
"evaluate expression from string to value"}, "evaluate expression from string to value"},
{"excsc", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_excsc}, {"excsc", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_excsc},
"exterior cosecant of a within accuracy b"}, "exterior cosecant of a, within accuracy b"},
{"exp", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_exp}, {"exp", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_exp},
"exponential of value a within accuracy b"}, "exponential of value a, within accuracy b"},
{"exsec", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_exsec}, {"exsec", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_exsec},
"exterior secant of a within accuracy b"}, "exterior secant of a, within accuracy b"},
{"fact", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_fact}, {"fact", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_fact},
"factorial"}, "factorial"},
{"factor", 1, 3, 0, OP_NOP, {.numfunc_cnt = f_factor}, {.null = NULL}, {"factor", 1, 3, 0, OP_NOP, {.numfunc_cnt = f_factor}, {.null = NULL},
@@ -12549,16 +12689,16 @@ STATIC CONST struct builtin builtins[] = {
{"h2hms", 4, 5, FA, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_h2hms}, {"h2hms", 4, 5, FA, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_h2hms},
"convert a to b hours, c min, d sec, rounding type e\n"}, "convert a to b hours, c min, d sec, rounding type e\n"},
{"hacovercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_hacovercos}, {"hacovercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_hacovercos},
"half coversed cosine of value a within accuracy b"}, "half coversed cosine of value a, within accuracy b"},
{"hacoversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_hacoversin}, {"hacoversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_hacoversin},
"half coversed sine of value a within accuracy b"}, "half coversed sine of value a, within accuracy b"},
{"hash", 1, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_hash}, {"hash", 1, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_hash},
"return non-negative hash value for one or\n" "return non-negative hash value for one or\n"
"\t\t\tmore values"}, "\t\t\tmore values"},
{"havercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_havercos}, {"havercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_havercos},
"half versed cosine of value a within accuracy b"}, "half versed cosine of value a, within accuracy b"},
{"haversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_haversin}, {"haversin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_haversin},
"half versed sine of value a within accuracy b"}, "half versed sine of value a, within accuracy b"},
{"head", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_head}, {"head", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_head},
"return list of specified number at head of a list"}, "return list of specified number at head of a list"},
{"highbit", 1, 1, 0, OP_HIGHBIT, {.null = NULL}, {.null = NULL}, {"highbit", 1, 1, 0, OP_HIGHBIT, {.null = NULL}, {.null = NULL},
@@ -12572,7 +12712,7 @@ STATIC CONST struct builtin builtins[] = {
{"hnrmod", 4, 4, 0, OP_NOP, {.numfunc_4 = f_hnrmod}, {.null = NULL}, {"hnrmod", 4, 4, 0, OP_NOP, {.numfunc_4 = f_hnrmod}, {.null = NULL},
"v mod h*2^n+r, h>0, n>0, r = -1, 0 or 1"}, "v mod h*2^n+r, h>0, n>0, r = -1, 0 or 1"},
{"hypot", 2, 3, FE, OP_NOP, {.numfunc_3 = qhypot}, {.null = NULL}, {"hypot", 2, 3, FE, OP_NOP, {.numfunc_3 = qhypot}, {.null = NULL},
"hypotenuse of right triangle within accuracy c"}, "hypotenuse of right triangle, within accuracy c"},
{"ilog", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_ilog}, {"ilog", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_ilog},
"integral log of a to integral base b"}, "integral log of a to integral base b"},
{"ilog10", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_ilog10}, {"ilog10", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_ilog10},
@@ -12695,13 +12835,13 @@ STATIC CONST struct builtin builtins[] = {
{"list", 0, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_list}, {"list", 0, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_list},
"create list of specified values"}, "create list of specified values"},
{"ln", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ln}, {"ln", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_ln},
"natural logarithm of value a within accuracy b"}, "natural logarithm of value a, within accuracy b"},
{"log", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_log}, {"log", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_log},
"base 10 logarithm of value a within accuracy b"}, "base 10 logarithm of value a, within accuracy b"},
{"log2", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_log2}, {"log2", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_log2},
"base 2 logarithm of value a within accuracy b"}, "base 2 logarithm of value a, within accuracy b"},
{"logn", 2, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_logn}, {"logn", 2, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_logn},
"base b logarithm of value a within accuracy c"}, "base b logarithm of value a, within accuracy c"},
{"lowbit", 1, 1, 0, OP_LOWBIT, {.null = NULL}, {.null = NULL}, {"lowbit", 1, 1, 0, OP_LOWBIT, {.null = NULL}, {.null = NULL},
"low bit number in base 2 representation"}, "low bit number in base 2 representation"},
{"ltol", 1, 2, FE, OP_NOP, {.numfunc_2 = f_legtoleg}, {.null = NULL}, {"ltol", 1, 2, FE, OP_NOP, {.numfunc_2 = f_legtoleg}, {.null = NULL},
@@ -12766,7 +12906,7 @@ STATIC CONST struct builtin builtins[] = {
{"pfact", 1, 1, 0, OP_NOP, {.numfunc_1 = qpfact}, {.null = NULL}, {"pfact", 1, 1, 0, OP_NOP, {.numfunc_1 = qpfact}, {.null = NULL},
"product of primes up till number"}, "product of primes up till number"},
{"pi", 0, 1, FE, OP_NOP, {.numfunc_1 = qpi}, {.null = NULL}, {"pi", 0, 1, FE, OP_NOP, {.numfunc_1 = qpi}, {.null = NULL},
"value of pi accurate to within epsilon"}, "value of pi, within accuracy a"},
{"pix", 1, 2, 0, OP_NOP, {.numfunc_cnt = f_pix}, {.null = NULL}, {"pix", 1, 2, 0, OP_NOP, {.numfunc_cnt = f_pix}, {.null = NULL},
"number of primes < = a < 2^32, return b if error"}, "number of primes < = a < 2^32, return b if error"},
{"places", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_places}, {"places", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_places},
@@ -12783,7 +12923,7 @@ STATIC CONST struct builtin builtins[] = {
{"popcnt", 1, 2, 0, OP_NOP, {.numfunc_cnt = f_popcnt}, {.null = NULL}, {"popcnt", 1, 2, 0, OP_NOP, {.numfunc_cnt = f_popcnt}, {.null = NULL},
"number of bits in a that match b (or 1)"}, "number of bits in a that match b (or 1)"},
{"power", 2, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_power}, {"power", 2, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_power},
"value a raised to the power b within accuracy c"}, "value a raised to the power b, within accuracy c"},
{"prevcand", 1, 5, 0, OP_NOP, {.numfunc_cnt = f_prevcand}, {.null = NULL}, {"prevcand", 1, 5, 0, OP_NOP, {.numfunc_cnt = f_prevcand}, {.null = NULL},
"largest value = = d mod e < a, ptest(a,b,c) true"}, "largest value = = d mod e < a, ptest(a,b,c) true"},
{"prevprime", 1, 2, 0, OP_NOP, {.numfunc_cnt = f_pprime}, {.null = NULL}, {"prevprime", 1, 2, 0, OP_NOP, {.numfunc_cnt = f_pprime}, {.null = NULL},
@@ -12840,7 +12980,7 @@ STATIC CONST struct builtin builtins[] = {
{"rm", 1, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_rm}, {"rm", 1, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_rm},
"remove file(s), -f turns off no-such-file errors"}, "remove file(s), -f turns off no-such-file errors"},
{"root", 2, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_root}, {"root", 2, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_root},
"value a taken to the b'th root within accuracy c"}, "value a taken to the b'th root, within accuracy c"},
{"round", 1, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_round}, {"round", 1, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_round},
"round value a to b number of decimal places"}, "round value a to b number of decimal places"},
{"rsearch", 2, 4, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_rsearch}, {"rsearch", 2, 4, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_rsearch},
@@ -12862,9 +13002,9 @@ STATIC CONST struct builtin builtins[] = {
"search matrix or list for value b starting\n" "search matrix or list for value b starting\n"
"\t\t\tat index c"}, "\t\t\tat index c"},
{"sec", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sec}, {"sec", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sec},
"secant of a within accuracy b"}, "secant of a, within accuracy b"},
{"sech", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sech}, {"sech", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sech},
"hyperbolic secant of a within accuracy b"}, "hyperbolic secant of a, within accuracy b"},
{"seed", 0, 0, 0, OP_NOP, {.numfunc_0 = f_seed}, {.null = NULL}, {"seed", 0, 0, 0, OP_NOP, {.numfunc_0 = f_seed}, {.null = NULL},
"return a 64 bit seed for a pseudo-random generator"}, "return a 64 bit seed for a pseudo-random generator"},
{"segment", 2, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_segment}, {"segment", 2, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_segment},
@@ -12878,9 +13018,9 @@ STATIC CONST struct builtin builtins[] = {
{"sha1", 0, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sha1}, {"sha1", 0, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sha1},
"Secure Hash Algorithm (SHS-1 FIPS Pub 180-1)"}, "Secure Hash Algorithm (SHS-1 FIPS Pub 180-1)"},
{"sin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sin}, {"sin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sin},
"sine of value a within accuracy b"}, "sine of value a, within accuracy b"},
{"sinh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sinh}, {"sinh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sinh},
"hyperbolic sine of a within accuracy b"}, "hyperbolic sine of a, within accuracy b"},
{"size", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_size}, {"size", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_size},
"total number of elements in value"}, "total number of elements in value"},
{"sizeof", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_sizeof}, {"sizeof", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_sizeof},
@@ -12890,7 +13030,7 @@ STATIC CONST struct builtin builtins[] = {
{"sort", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_sort}, {"sort", 1, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_1 = f_sort},
"sort a copy of a matrix or list"}, "sort a copy of a matrix or list"},
{"sqrt", 1, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sqrt}, {"sqrt", 1, 3, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_sqrt},
"square root of value a within accuracy b"}, "square root of value a, within accuracy b"},
{"srand", 0, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_srand}, {"srand", 0, 1, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_srand},
"seed the rand() function"}, "seed the rand() function"},
{"srandom", 0, 4, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_srandom}, {"srandom", 0, 4, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_srandom},
@@ -12944,9 +13084,9 @@ STATIC CONST struct builtin builtins[] = {
{"tail", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_tail}, {"tail", 2, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_2 = f_tail},
"retain list of specified number at tail of list"}, "retain list of specified number at tail of list"},
{"tan", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_tan}, {"tan", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_tan},
"tangent of a within accuracy b"}, "tangent of a, within accuracy b"},
{"tanh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_tanh}, {"tanh", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_tanh},
"hyperbolic tangent of a within accuracy b"}, "hyperbolic tangent of a, within accuracy b"},
{"test", 1, 1, 0, OP_TEST, {.null = NULL}, {.null = NULL}, {"test", 1, 1, 0, OP_TEST, {.null = NULL}, {.null = NULL},
"test that value is nonzero"}, "test that value is nonzero"},
{"time", 0, 0, 0, OP_NOP, {.numfunc_0 = f_time}, {.null = NULL}, {"time", 0, 0, 0, OP_NOP, {.numfunc_0 = f_time}, {.null = NULL},
@@ -12958,9 +13098,9 @@ STATIC CONST struct builtin builtins[] = {
{"usertime", 0, 0, 0, OP_NOP, {.numfunc_0 = f_usertime}, {.null = NULL}, {"usertime", 0, 0, 0, OP_NOP, {.numfunc_0 = f_usertime}, {.null = NULL},
"user mode CPU time in seconds"}, "user mode CPU time in seconds"},
{"vercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_vercos}, {"vercos", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_vercos},
"versed cosine of value a within accuracy b"}, "versed cosine of value a, within accuracy b"},
{"versin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_versin}, {"versin", 1, 2, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_versin},
"versed sine of value a within accuracy b"}, "versed sine of value a, within accuracy b"},
{"version", 0, 0, 0, OP_NOP, {.null = NULL}, {.valfunc_0 = f_version}, {"version", 0, 0, 0, OP_NOP, {.null = NULL}, {.valfunc_0 = f_version},
"calc version string"}, "calc version string"},
{"xor", 1, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_xor}, {"xor", 1, IN, 0, OP_NOP, {.null = NULL}, {.valfunc_cnt = f_xor},

View File

@@ -200,23 +200,24 @@ BLT_HELP_FILES= ${BLT_HELP_FILES_3} ${BLT_HELP_FILES_5} \
# to keep this list in nice sorted order. # to keep this list in nice sorted order.
# #
DETAIL_HELP= abs access acos acosh acot acoth acovercos acoversin \ DETAIL_HELP= abs access acos acosh acot acoth acovercos acoversin \
acsc acsch address agd ahacovercos ahacoversin ahavercos ahaversin \ acrd acsc acsch address aexcsc aexsec agd ahacovercos ahacoversin \
append appr arg argv arrow asec asech asin asinh assign atan atan2 \ ahavercos ahaversin append appr arg argv arrow asec asech asin asinh \
atanh avercos aversin avg base base2 bernoulli bit blk blkcpy blkfree \ assign atan atan2 atanh avercos aversin avg base base2 bernoulli bit \
blocks bround btrunc calc_tty calclevel calcpath catalan ceil cfappr \ blk blkcpy blkfree blocks bround btrunc calc_tty calclevel calcpath \
cfsim char cmdbuf cmp comb conj cos cosh cot coth count covercos \ catalan ceil cfappr cfsim char cmdbuf cmp comb conj cos cosh cot coth \
coversin cp csc csch ctime d2dm d2dms d2g d2r delete den dereference \ count covercos coversin cp crd csc csch ctime d2dm d2dms d2g d2r \
det digit digits display dms2d dp epsilon errcount errmax errno error \ delete den dereference det digit digits display dms2d dp epsilon \
errsym estr euler eval exp fact factor fclose fcnt feof ferror fflush \ errcount errmax errno error errsym estr euler eval excsc exp exsec \
fgetc fgetfield fgetfile fgetline fgets fgetstr fib files floor fopen \ fact factor fclose fcnt feof ferror fflush fgetc fgetfield fgetfile \
forall fpathopen fprintf fputc fputs fputstr frac free freebernoulli \ fgetline fgets fgetstr fib files floor fopen forall fpathopen fprintf \
freeeuler freeglobals freeredc freestatics frem freopen fscan fscanf \ fputc fputs fputstr frac free freebernoulli freeeuler freeglobals \
fseek fsize ftell g2d g2gm g2gms g2r gcd gcdrem gd getenv gms2g h2hm \ freeredc freestatics frem freopen fscan fscanf fseek fsize ftell g2d \
h2hms hacovercos hacoversin hash havercos haversin head highbit hmean \ g2gm g2gms g2r gcd gcdrem gd getenv gms2g h2hm h2hms hacovercos \
hms2h hnrmod hypot ilog ilog10 ilog2 im indices inputlevel insert int \ hacoversin hash havercos haversin head highbit hmean hms2h hnrmod \
inverse iroot isalnum isalpha isassoc isatty isblk iscntrl isconfig \ hypot ilog ilog10 ilog2 im indices inputlevel insert int inverse iroot \
isdefined isdigit iserror iseven isfile isgraph ishash isident isint \ isalnum isalpha isassoc isatty isblk iscntrl isconfig isdefined \
islist islower ismat ismult isnull isnum isobj isobjtype isodd isprime \ isdigit iserror iseven isfile isgraph ishash isident isint islist \
islower ismat ismult isnull isnum isobj isobjtype isodd isprime \
isprint isptr ispunct isqrt isrand israndom isreal isrel issimple \ isprint isptr ispunct isqrt isrand israndom isreal isrel issimple \
isspace issq isstr istype isupper isxdigit jacobi join lcm lcmfact \ isspace issq isstr istype isupper isxdigit jacobi join lcm lcmfact \
lfactor ln log log2 logn lowbit ltol makelist matdim matfill matmax \ lfactor ln log log2 logn lowbit ltol makelist matdim matfill matmax \

View File

@@ -54,8 +54,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2023 Landon Curt Noll ## Copyright (C) 1999,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -54,8 +54,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2021,2023 Landon Curt Noll ## Copyright (C) 1999,2021,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -53,8 +53,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -53,8 +53,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

88
help/acrd Normal file
View File

@@ -0,0 +1,88 @@
NAME
acrd - inverse trigonometric chord of a unit circle
SYNOPSIS
acrd(x [,eps])
TYPES
x number (real or complex)
eps 0 < real < 1, defaults to epsilon()
return number
DESCRIPTION
Calculate angle of unit circle chord of length x to a multiple of eps with error less in
absolute value than .75 * eps.
A chord of a circle is a straight line segment whose endpoints lie on a arc of a circle.
A chord extended infinitely on both directions into a line would produce a secant line.
This function is sometimes called chord, is equivalent to:
acrd(x) = 2 * asin(x / 2)
EXAMPLE
; print acrd(1/2), acrd(5/7), acrd(42/7)
0.50536051028415730696 0.73041444258073348124 3.14159265358979323846-3.52549434807817210092i
; print acrd(1, 1e-5), acrd(1, 1e-10), acrd(1, 1e-15), acrd(1, 1e-20)
1.0472 1.0471975512 1.047197551196598 1.04719755119659774616
; print acrd(2 + 3i, 1e-5), acrd(2 + 3i, 1e-10)
1.0472+2.63392i 1.0471975512+2.6339157938i
; pi = pi(1e-20)
; print acrd(pi/6), acrd(pi/2), acrd(pi)
0.52977229404847186194 1.80667822153302569472 3.14159265358979323846-2.04645495709510115864i
LIMITS
0 < eps < 1
LINK LIBRARY
NUMBER *qacrd(NUMBER *x, NUMBER *eps)
COMPLEX *c_acrd(COMPLEX *x, NUMBER *eps)
SEE ALSO
sin, cos, tan, cot, sec, csc
asin, acos, atan, acot, asec, acsc
coversin, vercos, covercos
aversin, acoversin, avercos, acovercos
haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc
crd
epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc 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 Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## Under source code control: 2023/10/02 16:49:42
## File existed as early as: 2023
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -57,8 +57,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2021,2023 Landon Curt Noll ## Copyright (C) 1999,2021,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -59,8 +59,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc exsec, aexsec, excsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -56,8 +56,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, excsc, aexcsc exsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -56,8 +56,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos ahaversin, hacoversin, havercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -56,8 +56,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, havercos, ahacovercos ahaversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -57,8 +57,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, ahacovercos ahaversin, hacoversin, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -57,8 +57,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
hacoversin, havercos, ahacovercos hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -54,8 +54,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2021,2023 Landon Curt Noll ## Copyright (C) 1999,2021,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -54,8 +54,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2021,2023 Landon Curt Noll ## Copyright (C) 1999,2021,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -54,8 +54,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2023 Landon Curt Noll ## Copyright (C) 1999,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -54,8 +54,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -54,8 +54,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -43,8 +43,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2021,2023 Landon Curt Noll ## Copyright (C) 1999,2021,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -49,8 +49,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2021,2023 Landon Curt Noll ## Copyright (C) 1999,2021,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -47,8 +47,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -47,8 +47,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

88
help/crd Normal file
View File

@@ -0,0 +1,88 @@
NAME
crd - trigonometric chord of a unit circle
SYNOPSIS
crd(x [,eps])
TYPES
x number (real or complex)
eps 0 < real < 1, defaults to epsilon()
return number
DESCRIPTION
Calculate length of unit circle chord with angle x to a multiple of eps with error less in
absolute value than .75 * eps.
A chord of a circle is a straight line segment whose endpoints lie on a arc of a circle.
A chord extended infinitely on both directions into a line would produce a secant line.
This function is sometimes called chord, is equivalent to:
crd(x) = 2 * sin(x / 2)
EXAMPLE
; print crd(1/2), crd(5/7), crd(42/7)
0.4948079185090458592 0.6991976162706840944 0.2822400161197344442
; print crd(1, 1e-5), crd(1, 1e-10), crd(1, 1e-15), crd(1, 1e-20)
0.95886 0.9588510772 0.958851077208406 0.95885107720840600054
; print crd(2 + 3i, 1e-5), crd(2 + 3i, 1e-10)
3.95896+2.3009i 3.9589688712+2.3009091988i
; pi = pi(1e-20)
; print crd(pi/6), crd(pi/2), crd(pi)
0.5176380902050415247 1.4142135623730950488 2
LIMITS
0 < eps < 1
LINK LIBRARY
NUMBER *qcrd(NUMBER *x, NUMBER *eps)
COMPLEX *c_crd(COMPLEX *x, NUMBER *eps)
SEE ALSO
sin, cos, tan, cot, sec, csc
asin, acos, atan, acot, asec, acsc
coversin, vercos, covercos
aversin, acoversin, avercos, acovercos
haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc
acrd
epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc 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 Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## Under source code control: 2023/10/02 16:49:42
## File existed as early as: 2023
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/

View File

@@ -49,8 +49,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2023 Landon Curt Noll ## Copyright (C) 1999,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -49,8 +49,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, aexcsc exsec, aexsec, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -49,8 +49,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
aexsec, excsc, aexcsc aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -47,8 +47,21 @@ SEE ALSO
haversin, hacoversin, havercos haversin, hacoversin, havercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -47,8 +47,21 @@ SEE ALSO
haversin, havercos, hacovercos haversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -47,8 +47,21 @@ SEE ALSO
haversin, hacoversin, hacovercos haversin, hacoversin, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -47,8 +47,21 @@ SEE ALSO
hacoversin, havercos, hacovercos hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -49,8 +49,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2023 Landon Curt Noll ## Copyright (C) 1999,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -43,8 +43,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2021,2023 Landon Curt Noll ## Copyright (C) 1999,2021,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -49,8 +49,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 1999,2023 Landon Curt Noll ## Copyright (C) 1999,2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -47,8 +47,22 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -47,8 +47,21 @@ SEE ALSO
haversin, hacoversin, havercos, hacovercos haversin, hacoversin, havercos, hacovercos
ahaversin, hacoversin, havercos, ahacovercos ahaversin, hacoversin, havercos, ahacovercos
exsec, aexsec, excsc, aexcsc exsec, aexsec, excsc, aexcsc
crd, acrd
epsilon epsilon
EXTERNAL RESOURCES
For general information on trigonometric functions, see:
https://en.wikipedia.org/wiki/Trigonometric_functions#Unit-circle_definitions
https://en.wikipedia.org/wiki/Versine
https://en.wikipedia.org/wiki/Exsecant
https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
https://en.wikipedia.org/wiki/Chord_(geometry)
https://en.wikipedia.org/wiki/Secant_line
https://en.wikipedia.org/wiki/Hartley_transform#cas
https://en.wikipedia.org/wiki/Cis_(mathematics)
## Copyright (C) 2023 Landon Curt Noll ## Copyright (C) 2023 Landon Curt Noll
## ##
## Calc is open software; you can redistribute it and/or modify it under ## Calc is open software; you can redistribute it and/or modify it under

View File

@@ -256,6 +256,9 @@ E_FUNC NUMBER *qaexsec(NUMBER *q, NUMBER *epsilon);
E_FUNC NUMBER *qexcsc(NUMBER *q, NUMBER *epsilon); E_FUNC NUMBER *qexcsc(NUMBER *q, NUMBER *epsilon);
E_FUNC NUMBER *qaexcsc_or_NULL(NUMBER *q, NUMBER *epsilon); E_FUNC NUMBER *qaexcsc_or_NULL(NUMBER *q, NUMBER *epsilon);
E_FUNC NUMBER *qaexcsc(NUMBER *q, NUMBER *epsilon); E_FUNC NUMBER *qaexcsc(NUMBER *q, NUMBER *epsilon);
E_FUNC NUMBER *qcrd(NUMBER *q, NUMBER *epsilon);
E_FUNC NUMBER *qacrd_or_NULL(NUMBER *q, NUMBER *epsilon);
E_FUNC NUMBER *qacrd(NUMBER *q, NUMBER *epsilon);
/* /*
* pseudo-seed generator * pseudo-seed generator

156
qtrans.c
View File

@@ -3467,3 +3467,159 @@ qaexcsc(NUMBER *q, NUMBER *epsilon)
*/ */
return res; return res;
} }
/*
* qcrd - trigonometric chord of a unit circle
*
* This uses the formula:
*
* crd(x) = 2 * sin(x / 2)
*
* given:
* q real value to pass to the trig function
* epsilon error tolerance / precision for trig calculation
*
* returns:
* real value result of trig function on q with error epsilon
*/
NUMBER *
qcrd(NUMBER *q, NUMBER *epsilon)
{
NUMBER *res; /* inverse trig value result */
NUMBER *qdiv2; /* q/2 */
NUMBER *qtmp; /* argument to inverse trig function */
/*
* firewall
*/
if (q == NULL) {
math_error("q is NULL for %s", __func__);
not_reached();
}
if (check_epsilon(epsilon) == false) {
math_error("Invalid epsilon arg for %s", __func__);
not_reached();
}
/*
* calculate trig function value
*/
qdiv2 = qdivi(q, 2);
qtmp = qsin(qdiv2, epsilon);
qfree(qdiv2);
res = qmuli(qtmp, 2);
qfree(qtmp);
/*
* return trigonometric result
*/
return res;
}
/*
* qacrd_or_NULL - return NULL or non-complex inverse trigonometric chord of a unit circle
*
* This uses the formula:
*
* acrd(x) = 2 * asin(x / 2)
*
* given:
* q real value to pass to the trig function
* epsilon error tolerance / precision for trig calculation
*
* returns:
* real value result of trig function on q with error epsilon
*
* returns:
* != NULL ==> real value result of trig function on q with error epsilon,
* NULL ==> trig function value cannot be expressed as a NUMBER
*
* NOTE: If this function returns NULL, consider calling the equivalent
* COMPLEX function from comfunc.c. See the help file for the
* related builtin for details.
*/
NUMBER *
qacrd_or_NULL(NUMBER *q, NUMBER *epsilon)
{
NUMBER *res; /* inverse trig value result */
NUMBER *qdiv2; /* q/2 */
NUMBER *qtmp; /* argument to inverse trig function */
/*
* firewall
*/
if (q == NULL) {
math_error("q is NULL for %s", __func__);
not_reached();
}
if (check_epsilon(epsilon) == false) {
math_error("Invalid epsilon arg for %s", __func__);
not_reached();
}
/*
* calculate inverse trig function value
*/
qdiv2 = qdivi(q, 2);
qtmp = qasin(qdiv2, epsilon);
qfree(qdiv2);
if (qtmp == NULL) {
return NULL;
}
res = qmuli(qtmp, 2);
qfree(qtmp);
/*
* return inverse trigonometric result
*/
return res;
}
/*
* qacrd - non-complex inverse trigonometric chord of a unit circle
*
* This uses the formula:
*
* acrd(x) = 2 * asin(x / 2)
*
* given:
* q real value to pass to the trig function
* epsilon error tolerance / precision for trig calculation
*
* returns:
* real value result of trig function on q with error epsilon
*/
NUMBER *
qacrd(NUMBER *q, NUMBER *epsilon)
{
NUMBER *res; /* inverse trig value result */
/*
* firewall
*/
if (q == NULL) {
math_error("q is NULL for %s", __func__);
not_reached();
}
if (check_epsilon(epsilon) == false) {
math_error("Invalid epsilon arg for %s", __func__);
not_reached();
}
/*
* calculate inverse trig function value
*/
res = qacrd_or_NULL(q, epsilon);
if (res == NULL) {
math_error("cannot compute inverse sine for acrd");
not_reached();
}
/*
* return inverse trigonometric result
*/
return res;
}