• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak wygląda definicja funkcji abs() z biblioteki cmath?

Object Storage Arubacloud
0 głosów
518 wizyt
pytanie zadane 17 lutego 2016 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
Przeglądałem tą bibliotekę, ale znalazłem same niezrozumiałe dziwactwa.

2 odpowiedzi

+2 głosów
odpowiedź 17 lutego 2016 przez Grzyboo Nałogowiec (28,860 p.)
wybrane 17 lutego 2016 przez Daaa22
 
Najlepsza
inline long long abs(long long __x) { return __x >= 0 ? __x : -__x; }

np. takie coś znalazłem, więc nie widzę tutaj nic niezrozumiałego. Jeśli chodzi o inline to jest to taka funkcja, której kod jest wklejany bezpośrednio zamiast wywołania funkcji, zamiast odwoływać się do samej funkcji (coś jak define)

Wykorzystywany jest też operator ?: czyli skrócony if.

komentarz 17 lutego 2016 przez niezalogowany

Podepnę się pod twoją odpowiedź, bezpośrednia implementacja

 

Proszę (kod wyciągnięty z libów Visual Studio):

_Check_return_ inline double abs(_In_ double _Xx) _NOEXCEPT
	{
	return (_CSTD fabs(_Xx));
	}


_Check_return_ inline float abs(_In_ float _Xx) _NOEXCEPT
	{
	return (_CSTD fabsf(_Xx));
	}


_Check_return_ inline float fabs(_In_ float _Xx) _NOEXCEPT
	{
	return (_CSTD fabsf(_Xx));
	}


	inline float fabsf(float _X) __GPU_ONLY
	{
		return __dp_d3d_absf(_X);
	}

Niestety czym dokładnie jest

__dp_d3d_absf

Nie udało mi się znaleźć

komentarz 17 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

@Szymon Siarkiewicz O co w tym chodzi? Po co tyle odniesień do innej funkcji?

komentarz 17 lutego 2016 przez niezalogowany
@Patrcyjerz autor pytał się o implementację abs z cmath, więc mu ją dałem. Nic nie poradzę że tak to wygląda :P
komentarz 17 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)

Ale to bez sensu, nie lepiej wpisać:

float abs(float n)
{
if(n<0)
{
n=n-n*2;
}
return n;
}

Działa tak samo, a znacznie mniej kodu

komentarz 17 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)

Albo krócej

float abs(float n)
{
if(n<0)n=n-n*2;
return n;
}
komentarz 17 lutego 2016 przez niezalogowany
@Daaa22 Twój kod jest mało wydajny, a autor nie pytał się o przykładową implementację, tylko jak ona wygląda w środku biblioteki cmath
komentarz 17 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)
1. Jak to mało wydajny?
2. Wiem, ja jestem autorem :)​
komentarz 17 lutego 2016 przez niezalogowany

Spójrz, najpierw porównujesz, potem kopiujesz i mnożysz razy 2 i odejmujesz. Ten sam efekt można uzyskać przy użyciu jednego porównania i odwróceniu liczby.

if (n < 0) n = -n;
return n;

 

komentarz 17 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)
Heh, nie pomyślałem o tym.
+1 głos
odpowiedź 17 lutego 2016 przez Radfler VIP (101,030 p.)

Znalazłem takie implementacje (z języka C):

a) abs:

int abs(int number) {
  return number >= 0 ? number : -number;
}

b) labs:

long labs(long n) {
  return  n >= 0L ? n : -n;
}

c) fabs (assembly):

                SECTION .text

                global  fabs
                global  _fabs
                
fabs:
_fabs:
                push    ebp
                mov     ebp,esp
                fld     qword [ebp+8]           ; Load real from stack
                fabs                            ; Take the absolute value
                pop     ebp
                ret

Podobne pytania

+1 głos
1 odpowiedź 523 wizyt
pytanie zadane 6 listopada 2019 w JavaScript przez Artek Stary wyjadacz (11,800 p.)
0 głosów
1 odpowiedź 222 wizyt
pytanie zadane 27 lutego 2019 w Python przez mietek_arduino Początkujący (330 p.)
+1 głos
1 odpowiedź 282 wizyt

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...