[C++] Jak napisać dane działanie matematyczne


(Cr4vens) #1

Otóż nie wiem jak zapisać wyrażenie matematyczne, które wygląda tak:

W = 1 / ( 1 + 10 ^( l / 400 ))

Proszę o pomoc w wytłumaczeniu tego jak to zrobić.

Zmienną l gdzieśtam wprowadzamy przedtem sami.


(Ryan) #2

Definiujesz zmienne l i w i piszesz to wyrażenie. Jedyną różnicą jest konieczność użycia pow z math.h.

http://www.cplusplus.com/reference/clibrary/cmath/pow/


(Kalin 93) #3

Chyba, że sam napisze funkcje która będzie zwracała spotengowaną liczbę :wink:


([alex]) #4

Uważasz że to takie skomplikowane?

double Pow(double x,double y) { return exp(log(x)*y); } [/code]

(flaszer) #5

Po co dublować coś, co znajduje się już w standardowej bibliotece math?


([alex]) #6

To zależy co chcesz osiągnąć. Wyliczanie log() oraz exp() jest dosyć kosztowne oraz niezbyt precyzyjne. Np brak w bibliotece funkcji:

long long pow(long long base,unsigned short exponent); [/code]

Da się zrealizować tak aby działała szybciej niż te standardowe.


(Ryan) #7

Plus: standardowo nie ma funkcji do operowania na liczbach stałoprzecinkowych (czy w szczególnym przypadku wskazanym przez Ciebie: całkowitych), co w pewnych sytuacjach (kalkulator) jest niezbędne. Poza tym jeśli liczby są całkowite, operowanie na liczbach zmiennoprzecinkowych (pow na nich działa) może się skończyć błędami wyniku. Są dziesiątki powodów dlaczego pewne rzeczy warto lub trzeba napisać od zera. :slight_smile:


(Frakti7) #8

Ten problem można obejść mnożąc zmienną typu całkowitego razy 1.0

W takim trywialnym przykładzie jaki podał kolega nie widzę potrzeby pisania funkcji potęgowej od podstaw.


([alex]) #9

Wygląda na to że nie znasz C++, przepraszam za bezpośredniość. Liczba całkowita sama się konwertuje na wartość zmiennoprzecinkową, no chyba że w wyrażeniach typu p/q gdzie p,i są całkowitoliczbowe, ale nawet w takim przypadku niema sensu mnożyć przez 1.0 wystarczy że zapiszemy (double)p/q lub p/(double)q. Natomiast Ryan nie o tym pisze, a o tym czymś takim:

#include int main()  {   double Sum=0;   for(int i=0;i1000;++i) Sum+=0.1;   if(Sum!=100) std::cout"Rozumiesz czemu !?";   std::cin.get();   return 0;  } [/code]
[code=php]if(pow(2./3.,23)!=8388608./94143178827.) cout"A to rozumiesz?"; 

2^23=8388608, 3^23=94143178827 = (2/3)^23=8388608/94143178827




[quote="frakti"]

W takim trywialnym przykładzie jaki podał kolega nie widzę potrzeby pisania funkcji potęgowej od podstaw.
[/quote]
A ktoś twierdzi inaczej ?

(Frakti7) #10

Cóż, człowiek uczy się całe życie :slight_smile:


(Ryan) #11

Nie, bardziej chodzi w tym wypadku o wiedzę na temat działania liczb zmiennoprzecinkowych (czyli w praktyce jakieś pojęcie o IEEE754).


([alex]) #12

To jest dowód mojej tezy.


(Ryan) #13

Aha, o to Ci chodziło. Mnie bardziej chodziło o to, że frakti nie zrozumiał w pierwszej kolejności o czym ja pisałem. (choć to akurat mogło być spowodowane marnym wyjaśnieniem z mojej strony)


([alex]) #14

Sapienti sat. Tylko frakti nie zrozumiał.


(Frakti7) #15

Okej, okej... już wystarczy.

Źle zinterpretowałem problem o jakim myślał Ryan , a który Ty alex ładnie wytłumaczyłeś. Dziękuję.

Wiem co to rzutowanie, motyw z "1.0" zbyt mi się utrwalił, ale to nie jest żadne tłumaczenie, dziękuję za zwrócenie uwagi.