Browse Source
Merge branch 'Logarithmen' into 'master'
Merge branch 'Logarithmen' into 'master'
Logarithmen See merge request fdai7848/Linkes-Twix!3master
fdai7848
11 months ago
6 changed files with 199 additions and 44 deletions
-
22src/exponent.c
-
2src/exponent.h
-
65src/logarithmus.c
-
9src/logarithmus.h
-
26test/test_exponent.c
-
119test/test_logarithmus.c
@ -0,0 +1,65 @@ |
|||
#include <stdio.h> |
|||
#include <limits.h> |
|||
|
|||
#include "logarithmus.h" |
|||
#include "exponent.h" |
|||
|
|||
double logX(double base, double value){ |
|||
if(base == 1.0 || base <= 0.0 || value <= 0.0){ |
|||
return -1.0; |
|||
} |
|||
return(logN(value)/logN(base)); |
|||
} |
|||
|
|||
double log10(double value){ |
|||
return logX(10.0, value); |
|||
} |
|||
|
|||
double log2(double value){ |
|||
return logX(2.0, value); |
|||
} |
|||
double lns(double x, double eps){ |
|||
double yn = x - 1.0; |
|||
double yn1 = yn; |
|||
|
|||
do{ |
|||
yn = yn1; |
|||
yn1 = yn + 2 * (x - exponential(yn)) / (x + exponential(yn)); |
|||
} while (absD(yn - yn1) > eps); |
|||
|
|||
return yn1; |
|||
} |
|||
|
|||
double lnb(double x){ |
|||
int power_adjust = 0; |
|||
while (x > 1.0) { |
|||
x /= exponential(1); |
|||
power_adjust++; |
|||
} |
|||
while (x < .25) { |
|||
x *= exponential(1); |
|||
power_adjust--; |
|||
} |
|||
|
|||
x -= 1.0; |
|||
double t = 0.0, s = 1.0, z = x; |
|||
for (int k=1; k<=100; k++) { |
|||
t += z * s / k; |
|||
z *= x; |
|||
s = -s; |
|||
} |
|||
return t + power_adjust; |
|||
} |
|||
|
|||
double logN(double x){ |
|||
if(x <= 0){ |
|||
return -1.0; |
|||
} |
|||
if(x<200){ |
|||
return lns(x, 0.00000001); |
|||
} |
|||
else{ |
|||
return lnb(x); |
|||
} |
|||
} |
|||
|
@ -0,0 +1,9 @@ |
|||
#ifndef LOGARITHMUS_H |
|||
#define LOGARITHMUS_H |
|||
|
|||
double logN(double x); |
|||
double logX(double b, double a); |
|||
double log10(double a); |
|||
double log2(double a); |
|||
|
|||
#endif // logarithmus.h |
@ -0,0 +1,119 @@ |
|||
#ifdef TEST |
|||
|
|||
#include "unity.h" |
|||
|
|||
#include "logarithmus.h" |
|||
#include "exponent.h" |
|||
|
|||
void setUp(void) |
|||
{ |
|||
} |
|||
|
|||
void tearDown(void) |
|||
{ |
|||
} |
|||
|
|||
void test_ln_with_positive_number(void){ |
|||
double r1, r2, r3; |
|||
|
|||
r1 = logN(1.0); |
|||
r2 = logN(10.0); |
|||
r3 = logN(2.5); |
|||
|
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 0, r1); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 2.302585, r2); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 0.916290, r3); |
|||
} |
|||
|
|||
void test_ln_with_zero_and_negative_numbers(void){ |
|||
double r1, r2, r3; |
|||
|
|||
r1 = logN(0.0); |
|||
r2 = logN(-1.0); |
|||
r3 = logN(-2.5); |
|||
|
|||
TEST_ASSERT_EQUAL_DOUBLE(-1.0, r1); |
|||
TEST_ASSERT_EQUAL_DOUBLE(-1.0, r2); |
|||
TEST_ASSERT_EQUAL_DOUBLE(-1.0, r3); |
|||
} |
|||
|
|||
void test_logarithmic_function_with_edge_cases(void){ |
|||
double r1, r2, r3, r4; |
|||
|
|||
r1 = logX(0, 10.0); |
|||
r2 = logX(-1.0, 9.0); |
|||
r3 = logX(1.0, 18.0); |
|||
r4 = logX(3.0, 0.0); |
|||
|
|||
TEST_ASSERT_EQUAL_DOUBLE(-1.0, r1); |
|||
TEST_ASSERT_EQUAL_DOUBLE(-1.0, r2); |
|||
TEST_ASSERT_EQUAL_DOUBLE(-1.0, r3); |
|||
TEST_ASSERT_EQUAL_DOUBLE(-1.0, r4); |
|||
} |
|||
|
|||
void test_logarithmic_function_with_integers(void){ |
|||
double r1, r2, r3, r4; |
|||
|
|||
r1 = logX(0.5, 48.0); |
|||
r2 = logX(2.0, 8.0); |
|||
r3 = logX(3.2, 18.0); |
|||
r4 = logX(6.0, 36.0); |
|||
|
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, -5.584962, r1); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 3.0, r2); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 2.484950, r3); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 2.0, r4); |
|||
} |
|||
|
|||
void test_logarithmic_function_with_decimals(void){ |
|||
double r1, r2, r3, r4; |
|||
|
|||
r1 = logX(0.1289, 26.5); |
|||
r2 = logX(7.64, 8.314); |
|||
r3 = logX(3.0, 2.4587); |
|||
r4 = logX(9.0, 94.6584); |
|||
|
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, -1.599607, r1); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 1.041577, r2); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 0.818881, r3); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 2.070919, r4); |
|||
} |
|||
|
|||
void test_logarithmic_function_to_base_10(void){ |
|||
double r1, r2, r3, r4, r5, r6; |
|||
|
|||
r1 = log10(100.0); |
|||
r2 = log10(100.6479); |
|||
r3 = log10(10.587); |
|||
r4 = log10(4.341); |
|||
r5 = log10(0.34979); |
|||
r6 = log10(1.0); |
|||
|
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 2.0, r1); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 2.002804, r2); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 1.024772, r3); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 0.637589, r4); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, -0.456192, r5); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 0.0, r6); |
|||
} |
|||
|
|||
void test_logarithmic_function_to_base_2(void){ |
|||
double r1, r2, r3, r4, r5, r6; |
|||
|
|||
r1 = log2(1024.0); |
|||
r2 = log2(1024.8742); |
|||
r3 = log2(900.587); |
|||
r4 = log2(78.341); |
|||
r5 = log2(0.34979); |
|||
r6 = log2(1.0); |
|||
|
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 10.0, r1); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 10.001231, r2); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 9.814721, r3); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 6.291695, r4); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, -1.515439, r5); |
|||
TEST_ASSERT_DOUBLE_WITHIN(0.000001, 0.0, r6); |
|||
} |
|||
|
|||
|
|||
#endif // TEST |
Write
Preview
Loading…
Cancel
Save
Reference in new issue