diff --git a/src/CalcManager/CEngine/RationalMath.cpp b/src/CalcManager/CEngine/RationalMath.cpp
index 00b628ab..0a6b8313 100644
--- a/src/CalcManager/CEngine/RationalMath.cpp
+++ b/src/CalcManager/CEngine/RationalMath.cpp
@@ -267,13 +267,13 @@ Rational RationalMath::ATan(Rational const& rat, AngleType angletype)
return result;
}
-Rational RationalMath::Sinh(Rational const& rat)
+Rational RationalMath::Sinh(Rational const& rat, AngleType angletype)
{
PRAT prat = rat.ToPRAT();
try
{
- sinhrat(&prat, RATIONAL_BASE, RATIONAL_PRECISION);
+ sinhanglerat(&prat, angletype, RATIONAL_BASE, RATIONAL_PRECISION);
}
catch (uint32_t error)
{
@@ -287,13 +287,13 @@ Rational RationalMath::Sinh(Rational const& rat)
return result;
}
-Rational RationalMath::Cosh(Rational const& rat)
+Rational RationalMath::Cosh(Rational const& rat, AngleType angletype)
{
PRAT prat = rat.ToPRAT();
try
{
- coshrat(&prat, RATIONAL_BASE, RATIONAL_PRECISION);
+ coshanglerat(&prat, angletype, RATIONAL_BASE, RATIONAL_PRECISION);
}
catch (uint32_t error)
{
@@ -307,13 +307,13 @@ Rational RationalMath::Cosh(Rational const& rat)
return result;
}
-Rational RationalMath::Tanh(Rational const& rat)
+Rational RationalMath::Tanh(Rational const& rat, AngleType angletype)
{
PRAT prat = rat.ToPRAT();
try
{
- tanhrat(&prat, RATIONAL_BASE, RATIONAL_PRECISION);
+ tanhanglerat(&prat, angletype, RATIONAL_BASE, RATIONAL_PRECISION);
}
catch (uint32_t error)
{
@@ -327,13 +327,13 @@ Rational RationalMath::Tanh(Rational const& rat)
return result;
}
-Rational RationalMath::ASinh(Rational const& rat)
+Rational RationalMath::ASinh(Rational const& rat, AngleType angletype)
{
PRAT prat = rat.ToPRAT();
try
{
- asinhrat(&prat, RATIONAL_BASE, RATIONAL_PRECISION);
+ asinhanglerat(&prat, angletype, RATIONAL_BASE, RATIONAL_PRECISION);
}
catch (uint32_t error)
{
@@ -347,13 +347,13 @@ Rational RationalMath::ASinh(Rational const& rat)
return result;
}
-Rational RationalMath::ACosh(Rational const& rat)
+Rational RationalMath::ACosh(Rational const& rat, AngleType angletype)
{
PRAT prat = rat.ToPRAT();
try
{
- acoshrat(&prat, RATIONAL_BASE, RATIONAL_PRECISION);
+ acoshanglerat(&prat, angletype, RATIONAL_BASE, RATIONAL_PRECISION);
}
catch (uint32_t error)
{
@@ -367,13 +367,13 @@ Rational RationalMath::ACosh(Rational const& rat)
return result;
}
-Rational RationalMath::ATanh(Rational const& rat)
+Rational RationalMath::ATanh(Rational const& rat, AngleType angletype)
{
PRAT prat = rat.ToPRAT();
try
{
- atanhrat(&prat, RATIONAL_PRECISION);
+ atanhanglerat(&prat, angletype, RATIONAL_PRECISION);
}
catch (uint32_t error)
{
diff --git a/src/CalcManager/CEngine/scifunc.cpp b/src/CalcManager/CEngine/scifunc.cpp
index 7e956285..b02f4997 100644
--- a/src/CalcManager/CEngine/scifunc.cpp
+++ b/src/CalcManager/CEngine/scifunc.cpp
@@ -120,7 +120,7 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r
case IDC_SINH: /* Sine- hyperbolic and archyperbolic */
if (!m_fIntegerMode)
{
- result = m_bInv ? ASinh(rat) : Sinh(rat);
+ result = m_bInv ? ASinh(rat, m_angletype) : Sinh(rat, m_angletype);
}
break;
@@ -134,7 +134,7 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r
case IDC_COSH: /* Cosine hyperbolic, follows convention of sine h function. */
if (!m_fIntegerMode)
{
- result = m_bInv ? ACosh(rat) : Cosh(rat);
+ result = m_bInv ? ACosh(rat, m_angletype) : Cosh(rat, m_angletype);
}
break;
@@ -148,7 +148,7 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r
case IDC_TANH: /* Same as sine h and cosine h. */
if (!m_fIntegerMode)
{
- result = m_bInv ? ATanh(rat) : Tanh(rat);
+ result = m_bInv ? ATanh(rat, m_angletype) : Tanh(rat, m_angletype);
}
break;
@@ -176,21 +176,21 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r
case IDC_SECH:
if (!m_fIntegerMode)
{
- result = m_bInv ? ACosh(Invert(rat)) : Invert(Cosh(rat));
+ result = m_bInv ? ACosh(Invert(rat), m_angletype) : Invert(Cosh(rat, m_angletype));
}
break;
case IDC_CSCH:
if (!m_fIntegerMode)
{
- result = m_bInv ? ASinh(Invert(rat)) : Invert(Sinh(rat));
+ result = m_bInv ? ASinh(Invert(rat), m_angletype) : Invert(Sinh(rat, m_angletype));
}
break;
case IDC_COTH:
if (!m_fIntegerMode)
{
- result = m_bInv ? ATanh(Invert(rat)) : Invert(Tanh(rat));
+ result = m_bInv ? ATanh(Invert(rat), m_angletype) : Invert(Tanh(rat, m_angletype));
}
break;
diff --git a/src/CalcManager/CalcManager.vcxproj b/src/CalcManager/CalcManager.vcxproj
index 7df97dba..f17b746d 100644
--- a/src/CalcManager/CalcManager.vcxproj
+++ b/src/CalcManager/CalcManager.vcxproj
@@ -346,4 +346,4 @@
-
+
\ No newline at end of file
diff --git a/src/CalcManager/Header Files/RationalMath.h b/src/CalcManager/Header Files/RationalMath.h
index f3ba56ec..705eeebe 100644
--- a/src/CalcManager/Header Files/RationalMath.h
+++ b/src/CalcManager/Header Files/RationalMath.h
@@ -29,10 +29,10 @@ namespace CalcEngine::RationalMath
Rational ACos(Rational const& rat, AngleType angletype);
Rational ATan(Rational const& rat, AngleType angletype);
- Rational Sinh(Rational const& rat);
- Rational Cosh(Rational const& rat);
- Rational Tanh(Rational const& rat);
- Rational ASinh(Rational const& rat);
- Rational ACosh(Rational const& rat);
- Rational ATanh(Rational const& rat);
+ Rational Sinh(Rational const& rat, AngleType angletype);
+ Rational Cosh(Rational const& rat, AngleType angletype);
+ Rational Tanh(Rational const& rat, AngleType angletype);
+ Rational ASinh(Rational const& rat, AngleType angletype);
+ Rational ACosh(Rational const& rat, AngleType angletype);
+ Rational ATanh(Rational const& rat, AngleType angletype);
}
diff --git a/src/CalcManager/Ratpack/itrans.cpp b/src/CalcManager/Ratpack/itrans.cpp
index 75e74785..dd855257 100644
--- a/src/CalcManager/Ratpack/itrans.cpp
+++ b/src/CalcManager/Ratpack/itrans.cpp
@@ -17,23 +17,6 @@
//-----------------------------------------------------------------------------
#include "ratpak.h"
-void ascalerat(_Inout_ PRAT* pa, AngleType angletype, int32_t precision)
-{
- switch (angletype)
- {
- case AngleType::Radians:
- break;
- case AngleType::Degrees:
- divrat(pa, two_pi, precision);
- mulrat(pa, rat_360, precision);
- break;
- case AngleType::Gradians:
- divrat(pa, two_pi, precision);
- mulrat(pa, rat_400, precision);
- break;
- }
-}
-
//-----------------------------------------------------------------------------
//
// FUNCTION: asinrat, _asinrat
diff --git a/src/CalcManager/Ratpack/itransh.cpp b/src/CalcManager/Ratpack/itransh.cpp
index 36c3c48f..fe579f98 100644
--- a/src/CalcManager/Ratpack/itransh.cpp
+++ b/src/CalcManager/Ratpack/itransh.cpp
@@ -85,6 +85,13 @@ void asinhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
destroyrat(neg_pt_eight_five);
}
+void asinhanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
+
+{
+ asinhrat(pa, radix, precision);
+ ascalerat(pa, angletype, precision);
+}
+
//-----------------------------------------------------------------------------
//
// FUNCTION: acoshrat
@@ -121,6 +128,13 @@ void acoshrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
}
}
+void acoshanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
+
+{
+ acoshrat(pa, radix, precision);
+ ascalerat(pa, angletype, precision);
+}
+
//-----------------------------------------------------------------------------
//
// FUNCTION: atanhrat
@@ -151,3 +165,10 @@ void atanhrat(_Inout_ PRAT* px, int32_t precision)
divrat(px, rat_two, precision);
destroyrat(ptmp);
}
+
+void atanhanglerat(_Inout_ PRAT* pa, AngleType angletype, int32_t precision)
+
+{
+ atanhrat(pa, precision);
+ ascalerat(pa, angletype, precision);
+}
diff --git a/src/CalcManager/Ratpack/ratpak.h b/src/CalcManager/Ratpack/ratpak.h
index dbb26824..a0244300 100644
--- a/src/CalcManager/Ratpack/ratpak.h
+++ b/src/CalcManager/Ratpack/ratpak.h
@@ -373,12 +373,20 @@ extern PRAT _createrat(void);
// angle type
extern void acosanglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
+// returns a new rat structure with the acosh of x->p/x->q taking into account
+// angle type
+extern void acoshanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision);
+
// returns a new rat structure with the acosh of x->p/x->q
extern void acoshrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
// returns a new rat structure with the acos of x->p/x->q
extern void acosrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
+// returns a new rat structure with the asinh of x->p/x->q taking into account
+// angle type
+extern void asinhanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision);
+
// returns a new rat structure with the asin of x->p/x->q taking into account
// angle type
extern void asinanglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
@@ -393,12 +401,20 @@ extern void asinrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
// angle type
extern void atananglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
+// returns a new rat structure with the atanh of x->p/x->q taking into account
+// angle type
+extern void atanhanglerat(_Inout_ PRAT* pa, AngleType angletype, int32_t precision);
+
// returns a new rat structure with the atanh of x->p/x->q
extern void atanhrat(_Inout_ PRAT* px, int32_t precision);
// returns a new rat structure with the atan of x->p/x->q
extern void atanrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
+// returns a new rat structure with the hyperbolic cosine of x->p/x->q taking into account
+// angle type
+extern void coshanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision);
+
// returns a new rat structure with the cosh of x->p/x->q
extern void coshrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
@@ -425,6 +441,10 @@ extern PRAT i32torat(int32_t ini32);
extern PRAT Ui32torat(uint32_t inui32);
extern PRAT numtorat(_In_ PNUMBER pin, uint32_t radix);
+// returns a new rat structure with the hyperbolic sin of x->p/x->q taking into account
+// angle type
+extern void sinhanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision);
+
extern void sinhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
extern void sinrat(_Inout_ PRAT* px);
@@ -432,6 +452,10 @@ extern void sinrat(_Inout_ PRAT* px);
// angle type
extern void sinanglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
+// returns a new rat structure with the hyperbolic tan of x->p/x->q taking into account
+// angle type
+extern void tanhanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision);
+
extern void tanhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
extern void tanrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
@@ -483,3 +507,5 @@ extern void inbetween(_In_ PRAT* px, _In_ PRAT range, int32_t precision);
extern void trimit(_Inout_ PRAT* px, int32_t precision);
extern void _dumprawrat(_In_ const wchar_t* varname, _In_ PRAT rat, std::wostream& out);
extern void _dumprawnum(_In_ const wchar_t* varname, _In_ PNUMBER num, std::wostream& out);
+extern void scalerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision);
+extern void ascalerat(_Inout_ PRAT* pa, AngleType angletype, int32_t precision);
diff --git a/src/CalcManager/Ratpack/support.cpp b/src/CalcManager/Ratpack/support.cpp
index bcd31da2..99f7dcc6 100644
--- a/src/CalcManager/Ratpack/support.cpp
+++ b/src/CalcManager/Ratpack/support.cpp
@@ -530,6 +530,39 @@ void scale2pi(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
destroyrat(pret);
}
+void scalerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
+{
+ switch (angletype)
+ {
+ case AngleType::Radians:
+ scale2pi(pa, radix, precision);
+ break;
+ case AngleType::Degrees:
+ scale(pa, rat_360, radix, precision);
+ break;
+ case AngleType::Gradians:
+ scale(pa, rat_400, radix, precision);
+ break;
+ }
+}
+
+void ascalerat(_Inout_ PRAT* pa, AngleType angletype, int32_t precision)
+{
+ switch (angletype)
+ {
+ case AngleType::Radians:
+ break;
+ case AngleType::Degrees:
+ divrat(pa, two_pi, precision);
+ mulrat(pa, rat_360, precision);
+ break;
+ case AngleType::Gradians:
+ divrat(pa, two_pi, precision);
+ mulrat(pa, rat_400, precision);
+ break;
+ }
+}
+
//---------------------------------------------------------------------------
//
// FUNCTION: inbetween
diff --git a/src/CalcManager/Ratpack/trans.cpp b/src/CalcManager/Ratpack/trans.cpp
index 50055e22..9e2d9bfa 100644
--- a/src/CalcManager/Ratpack/trans.cpp
+++ b/src/CalcManager/Ratpack/trans.cpp
@@ -16,22 +16,6 @@
#include "ratpak.h"
-void scalerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
-{
- switch (angletype)
- {
- case AngleType::Radians:
- scale2pi(pa, radix, precision);
- break;
- case AngleType::Degrees:
- scale(pa, rat_360, radix, precision);
- break;
- case AngleType::Gradians:
- scale(pa, rat_400, radix, precision);
- break;
- }
-}
-
//-----------------------------------------------------------------------------
//
// FUNCTION: sinrat, _sinrat
diff --git a/src/CalcManager/Ratpack/transh.cpp b/src/CalcManager/Ratpack/transh.cpp
index 8e033aa5..02147df1 100644
--- a/src/CalcManager/Ratpack/transh.cpp
+++ b/src/CalcManager/Ratpack/transh.cpp
@@ -109,6 +109,35 @@ void sinhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
}
}
+void sinhanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
+
+{
+ if (angletype != AngleType::Radians)
+ {
+ scalerat(pa, angletype, radix, precision);
+ }
+ switch (angletype)
+ {
+ case AngleType::Degrees:
+ if (rat_gt(*pa, rat_180, precision))
+ {
+ subrat(pa, rat_360, precision);
+ }
+ divrat(pa, rat_180, precision);
+ mulrat(pa, pi, precision);
+ break;
+ case AngleType::Gradians:
+ if (rat_gt(*pa, rat_200, precision))
+ {
+ subrat(pa, rat_400, precision);
+ }
+ divrat(pa, rat_200, precision);
+ mulrat(pa, pi, precision);
+ break;
+ }
+ _sinhrat(pa, precision);
+}
+
//-----------------------------------------------------------------------------
//
// FUNCTION: coshrat
@@ -198,6 +227,43 @@ void coshrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
}
}
+void coshanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
+
+{
+ if (angletype != AngleType::Radians)
+ {
+ scalerat(pa, angletype, radix, precision);
+ }
+ switch (angletype)
+ {
+ case AngleType::Degrees:
+ if (rat_gt(*pa, rat_180, precision))
+ {
+ PRAT ptmp = nullptr;
+ DUPRAT(ptmp, rat_360);
+ subrat(&ptmp, *pa, precision);
+ destroyrat(*pa);
+ *pa = ptmp;
+ }
+ divrat(pa, rat_180, precision);
+ mulrat(pa, pi, precision);
+ break;
+ case AngleType::Gradians:
+ if (rat_gt(*pa, rat_200, precision))
+ {
+ PRAT ptmp = nullptr;
+ DUPRAT(ptmp, rat_400);
+ subrat(&ptmp, *pa, precision);
+ destroyrat(*pa);
+ *pa = ptmp;
+ }
+ divrat(pa, rat_200, precision);
+ mulrat(pa, pi, precision);
+ break;
+ }
+ _coshrat(pa, radix, precision);
+}
+
//-----------------------------------------------------------------------------
//
// FUNCTION: tanhrat
@@ -224,3 +290,32 @@ void tanhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
destroyrat(ptmp);
}
+
+void tanhanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
+
+{
+ if (angletype != AngleType::Radians)
+ {
+ scalerat(pa, angletype, radix, precision);
+ }
+ switch (angletype)
+ {
+ case AngleType::Degrees:
+ if (rat_gt(*pa, rat_180, precision))
+ {
+ subrat(pa, rat_180, precision);
+ }
+ divrat(pa, rat_180, precision);
+ mulrat(pa, pi, precision);
+ break;
+ case AngleType::Gradians:
+ if (rat_gt(*pa, rat_200, precision))
+ {
+ subrat(pa, rat_200, precision);
+ }
+ divrat(pa, rat_200, precision);
+ mulrat(pa, pi, precision);
+ break;
+ }
+ tanhrat(pa, radix, precision);
+}