Wpis z mikrobloga

Mam jedno małe pytanko do bardziej ogarniętych w C++ niż ja.

Czy jest jakiś sens w używaniu do obliczania silni w obiekcie array typu long double? Uważam to za bezsensowne, ponieważ jako że silnia wywodzi się z liczb naturalnych, każda z silni przyjmie postać liczby naturalnej. Typ zmiennoprzecinkowy nie ma racji bytu.

A dlaczego pytam? Ponieważ w książce mam zadanie, aby wykorzystać do tego long double i znaleźć wartość 100!. Być może chodzi tu o wykorzystanie notacji wykładniczej, hm?

Dziękuję za wskazówki.

#cpp
  • 8
  • Odpowiedz
@Tobruk: long double ma przypuszczam 64 bity, mieście więc liczby do 1.7 * 10^308 (ale 15 cyfr)

a long long 64-bitowy ~ 9 * 10^18.

100! jest rzędu 10^157, więc w long longu się nie zmieści, a w long double tak (ale niedokładnie)

Normalnie powinno się użyć do tego binumów czy bigintów, ale jako ćw. w książce by to nie miało zbytniego sensu.
  • Odpowiedz
@kuhar: Czyli wynik 100! powinienem podzielić natychmiastowo przez 1000000000000000 (15 cyfr) aby przystosować to do notacji wykładniczej? I potem np.

std::cout << "100! = " << wynik << " * 10^15" << std::endl
  • Odpowiedz
  • 1
@Tobruk: double przechowuje inaczej liczby - w postaci wykladniczej (cecha i mantysa) - wiec mozna przechowywac wieksze liczby, ale niedokladnie. Byc moze to byl powod.
  • Odpowiedz
@Tobruk: wydziel funkcje z main'a tak, żeby było wiadomo co się dzieje: wyliczanie średniej w osobnej funkcji, inicjalizacja factorials osobno itp. Poza tym niepisana zasada w C/C++ mówi, że stałe (const int Arrsize) nazywa się z dużej litery. Unikaj też skrótów i ogólników ('Arrsize' jest zbyt ogólną nazwą, znacznie lepiej 'FACTORIALS_COUNT').

Poza tym spoko ; ).
  • Odpowiedz