3973 - Logaritm

De la Universitas MediaWiki

Cerinţa

Dându-se un număr real x, să se scrie un program care calculează ln(x) cu 6 zecimale exacte.

Date de intrare

Programul citește de la tastatură numărul real x.

Date de ieșire

Programul va afișa pe ecran rezultatul cu 6 zecimale exacte.

Restricţii şi precizări

  • 1 ⩽ x ⩽ 2.000.000.000.
  • x va avea cel mult 6 zecimale.
  • Nu se vor folosi funcțiile logaritmice ale limbajului C++

Exemplu 1

Intrare
5.12
Ieșire
Datele de intrare corespund restrictiilor impuse
1.633154

Exemplu 2

Intrare
-1
Ieșire
Datele de intrare nu corespund restrictiilor impuse

Rezolvare

import math


def ln(x):
    # Precizia pe care o dorim
    epsilon = 1e-10

    # Inițializăm limitele intervalului pentru metoda bisecției
    low = 0
    high = x if x > 1 else 1

    # Aplicăm metoda bisecției
    while high - low > epsilon:
        mid = (low + high) / 2
        if math.exp(mid) < x:
            low = mid
        else:
            high = mid

    # Returnăm rezultatul cu 6 zecimale exacte
    return round((low + high) / 2, 6)


def validare(x):
    if not 1 <= x <= 2_000_000_000:
        return False, "Datele de intrare nu corespund restrictiilor impuse"
    return True, "Datele de intrare corespund restrictiilor impuse"


def main():
    print("Introduceți numărul real x:")
    x = float(input())

    valid, message = validare(x)
    print(message)
    if not valid:
        return

    print("ln(x) calculat cu 6 zecimale exacte este:")
    print(ln(x))


if __name__ == "__main__":
    main()