Jeśli tylko liczymy coś bardziej skomplikowanego niż rozmieszczenie kontrolek w oknie, to niechybnie zaczniemy potrzebować którejś ze stałych matematycznych – na przykład π. Co wtedy robimy? Ano całkiem często skutkuje to włączeniem do programu deklaracji typu:
Nie jest to oczywiście wielkie zło (a już na pewno mniejsze niż bezpośrednie korzystanie z definicji typu π = 4atan(1)), ale w większości przypadków jest to też wyważanie otwartych drzwi. Potrzebne stałe mamy bowiem często już gdzieś zdefiniowane – trzeba tylko wiedzieć, gdzie ich poszukać:
M_PI
, M_E
, a nawet M_LN10
czy M_SQRT2
zdefiniowane w math.h lub cmath. Definicje te nie są jednak częścią standardu, więc dbające o zgodność kompilatory (czyli większość kompilatorów w ogóle) wymagają pewnych #define
‘ów przed dołączeniem ww. nagłówków. I tak dla Visual C++ jest to _USE_MATH_DEFINES
, a dla GCC bodajże prawie dowolne z makr _SOURCE
(jak _GNU_SOURCE
czy _ALL_SOURCE
).DX3DX_PI
i D3DX1BYPI
(1/π) – co nie dziwi, bo przecież w grafice więcej do szczęścia nie potrzeba ;) Obie te stałe są zdefiniowane w d3dx#math.h (gdzie #
to numer wersji DirectX), który to nagłówek jest dołączany automatycznie jeśli korzystamy z D3DX.PI
i E
zdefiniowane jako statyczne pola klasy System.Math
. W Javie klasa java.lang.Math
zawiera dwa identycznie zdefiniowane pola.Jak zatem łatwo zauważyć, wynajdywanie koła w postaci definicji π czy e jest w wielu przypadkach nieuzasadnione :]
A jak najprościej poradzić sobie ze znajdowaniem wartości stałych matematycznych? Ja używam do tego gogle ;)
Wystarczy wpisać np. e^gamma i dostajemy ładny wynik z kalkulatora przed odpowiedziami.
uses Google.Constants;
i potem w kodzie
var pi = Google.PI;
var e = Google.E;
;)
Co za różnica czy użyjemy własnych defines, czy defines kogoś innego? Te stałe są i tak stałe. ;P
@Charibo: o to, że niektórzy uprawiają bezmyślną silnikologię (klepacze kodu …).
Nie lepiej tak?
static public double Pi
{
get
{
Application.CurrentCulture = new System.Globalization.CultureInfo(“en-US”);
System.Net.WebClient wc = new System.Net.WebClient();
var s = wc.DownloadString(“http://google.com/search?q=pi”);
s = s.Substring(s.IndexOf(“pi =”) + 4);
s = s.Substring(0, s.IndexOf(“<“));
return double.Parse(s);
}
}
Eej silnikologia wcale nie musi być bezmyślna ;) – nawet jeśli samemu zdefiniujemy takie stałe to nie zawsze jest to złe. Zwłasza jeśli ktoś sobie pisze własną bibliotekę matematyczną do silnika (a robi to praktycznie każdy), to głupio byłoby gdyby zabrakło w niej liczby pi…
A ja nawet cmath ostatnio nie mam i daję sobie radę… Zlinczujecie mnie za to, że mam własną implementację libc?
To już któraś twoja własna implementacja rzeczy których nie potrzeba implementować samemu. Zamiast licznować, pogratuluję wytrwałości. ;)
zdefiniowanie własnej stałej matematycznej, to bezmyślne klepanie kodu i wynajdywanie koła na nowo?
chyba niektórzy już całkiem nie mają się czego czepić…
LOL && OMG
znacznie dłużej szukałbym nazwy tego makra które trzeba ustawić żeby mieć stałe z cmath, niż znalezienie wartości pi czy e i klepnięcie sobie stałej z tego
Charibo, to pisz OS korzystając z kompilatorowego libc, powodzenia.
Obstaję przy swoim – nadal gratuluję wytrwałości.
Ja też obstaję przy swoim – wyboru zbytnio nie mam, przy kodzeniu OSa aż tak wiele funkcji libca się nie używa, ale te kilka używanych TRZEBA napisać samemu. Amen.
Dobrze wiedzieć. ( ;) )