From da7568e64493271c3bbb9a80824e174d92b22f5a Mon Sep 17 00:00:00 2001 From: kappa Date: Mon, 21 Jan 2019 18:44:56 +0100 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BC=D0=BF=D0=BB=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B8=D1=80=D0=B0=D0=BD=D0=B5=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=98=D0=B5=20=D0=B7=D0=B0=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D0=B2=D0=B5=D1=80=D0=B7=D0=B8=D1=98=D1=83=20=D1=82=D0=B8?= =?UTF-8?q?=D0=BF=D0=B0=20=D0=B1=D1=80=D0=BE=D1=98=D0=B5=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- init.c | 2 ++ internals.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ internals.h | 2 ++ util.c | 26 ++++++++++++++++++++++++++ util.h | 1 + 5 files changed, 75 insertions(+) diff --git a/init.c b/init.c index c608d4d..1ed3054 100644 --- a/init.c +++ b/init.c @@ -21,4 +21,6 @@ void init() addSymbolInternal("*", &multiply); addSymbolInternal("/", ÷); addSymbolInternal("навод", "e); + addSymbolInternal("тачно->нетачно", &exactToInexact); + addSymbolInternal("нетачно->тачно", &inexactToExact); } diff --git a/internals.c b/internals.c index a2e2b91..69ac06b 100644 --- a/internals.c +++ b/internals.c @@ -131,6 +131,50 @@ object divide(object parameters) return result; } +object exactToInexact(object parameters) +{ + object result; + + if (listLength(parameters) != 1) + { + TYPE(result) = errorObject; + ERR(result) = argumentNumberError; + } + else if (TYPE(CAR(parameters)) != numberObject) + { + TYPE(result) = errorObject; + ERR(result) = typeError; + } + else + { + result = exactToInexactNum(CAR(parameters)); + } + + return result; +} + +object inexactToExact(object parameters) +{ + object result; + + if (listLength(parameters) != 1) + { + TYPE(result) = errorObject; + ERR(result) = argumentNumberError; + } + else if (TYPE(CAR(parameters)) != numberObject) + { + TYPE(result) = errorObject; + ERR(result) = typeError; + } + else + { + result = inexactToExactNum(CAR(parameters)); + } + + return result; +} + object quote(object parameters) { object result; diff --git a/internals.h b/internals.h index 3a6fa3b..0a0f1ba 100644 --- a/internals.h +++ b/internals.h @@ -4,4 +4,6 @@ object add(object parameters); object subtract(object parameters); object multiply(object parameters); object divide(object parameters); +object exactToInexact(object parameters); +object inexactToExact(object parameters); object quote(object parameters); diff --git a/util.c b/util.c index a8e03f7..3dc0993 100644 --- a/util.c +++ b/util.c @@ -1,5 +1,7 @@ #include +#include #include +#include #include "util.h" @@ -96,6 +98,30 @@ object exactToInexactNum(object a) return result; } +object inexactToExactNum(object a) +{ + object result = copyObject(a); + + if (TYPE(result) == numberObject && NUM_TYPE(result) == realNum) + { + long long int divisor = 1; + while (NUM_REAL(result) != floorl(NUM_REAL(result)) && + divisor <= INT_MAX) + { + NUM_REAL(result) *= 10.0L; + divisor *= 10LL; + } + + NUM_TYPE(result) = fractionNum; + NUM_NUMER(result) = (long long int) floorl(NUM_REAL(result)); + NUM_DENOM(result) = divisor; + + result = shortenFractionNum(result); + } + + return result; +} + long long int gcd(long long int a, long long int b) /* највећи заједнички делилац */ { diff --git a/util.h b/util.h index eda3c07..9c00060 100644 --- a/util.h +++ b/util.h @@ -84,6 +84,7 @@ object copyObject(object input); object longlongToNumber(long long int input); object shortenFractionNum(object a); object exactToInexactNum(object a); +object inexactToExactNum(object a); object plusNum(object a, object b); object minusNum(object a); object timesNum(object a, object b);