RodrigoDornelles / 3bc-lang

Low-level language, tiny virtual machine, minimal runtime, intermediate representation, embeddable, easy for beginners. (Friendly Punched cards)
https://3bc-lang.org
GNU General Public License v3.0
231 stars 25 forks source link

implement log10 from scratch #407

Open RodrigoDornelles opened 1 year ago

RodrigoDornelles commented 1 year ago
#include <stdio.h>

double log10_custom(double x) {
    if (x <= 0) {
        fprintf(stderr, "Error: log10 of non-positive number is undefined.\n");
        return 0.0;
    }

    union {
        double f;
        unsigned long long i;
    } converter;

    converter.f = x;

    // Extracting the exponent bits
    int exponent = (converter.i >> 52) - 1023;

    // Masking out the exponent bits
    converter.i &= ~(0xFFFULL << 52);
    converter.i |= 1023ULL << 52;

    double y = converter.f - 1.0;
    double z = y * y;

    // Coefficients for the Taylor series
    const double c1 = 0.333333333333333;
    const double c2 = 0.2;
    const double c3 = 0.142857142857143;
    const double c4 = 0.111111111111111;
    const double c5 = 0.0909090909090909;
    const double c6 = 0.0769230769230769;
    const double c7 = 0.0666666666666667;
    const double c8 = 0.0588235294117647;

    // Calculate the logarithm using a simplified Taylor series approximation
    double result = y * (c1 + z * (c2 + z * (c3 + z * (c4 + z * (c5 + z * (c6 + z * (c7 + z * c8)))))));

    // Add the exponent back to the result
    result += exponent;

    return result;
}

int main() {
    double x = 100.0;
    double result = log10_custom(x);
    printf("log10(%lf) = %lf\n", x, result);

    return 0;
}