Czy istnieje standardowa funkcja znaku (signum, sgn) w C/C ++?
Potrzebuję funkcji, która zwraca -1 dla liczb ujemnych i +1 dla liczb dodatnich.
http://en.wikipedia.org/wiki/Sign_function
http://en.wikipedia.org/wiki/Sign_function
Łatwo jest napisać własną, ale wygląda na to, że powinna znajdować się gdzieś w standardowej bibliotece.
Edycja: w szczególności szukałem funkcji działającej na pływakach.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
21 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Korzyści:
Ostrzeżenia:
Anonimowy użytkownik
Potwierdzenie od:
Oto bardziej czytelny sposób, aby to zrobić:
Jeśli podoba Ci się operator trójskładnikowy, możesz to zrobić:
Anonimowy użytkownik
Potwierdzenie od:
da wynik +/- 1,0, w zależności od znaku wartości. Zauważ, że zera zmiennoprzecinkowe są podpisane: (+0) da +1, a (-0) da -1.
Anonimowy użytkownik
Potwierdzenie od:
Czy istnieje standardowa funkcja znaku (signum, sgn) w C/C ++?
Nie ma go jednak w standardowej bibliotece http://en.cppreference.com/w/c ... ysign
którego można używać w bardzo podobny sposób przez i zawiera funkcję prawdziwego logowania http://www.boost.org/doc/libs/ ... .html
które również mogą być częścią standardu.
http://www.boost.org/doc/libs/ ... .html
http://www.boost.org/doc/libs/ ... .html
Anonimowy użytkownik
Potwierdzenie od:
standard
Funkcje C ++ .
Anonimowy użytkownik
Potwierdzenie od:
Tak, w zależności od definicji.
C99 i nowsze wersje mają makro w
(real-floating );
Makro zwraca wartość różną od zera wtedy i tylko wtedy, gdy znak wartości argumentu jest ujemny. C11 §7.12.3.6
A jednak OP chce czegoś innego.
Potrzebuję funkcji, która zwraca -1 dla liczb ujemnych i +1 dla liczb dodatnich. ... funkcja, która działa na pływakach.
Głębiej
:
Ta pozycja nie jest specyficzna w następujących przypadkach, .
Klasyczny https://en.wikipedia.org/wiki/Sign_function
zwraca do , do i do .
Wiele odpowiedzi już dotyczyło tego pytania, ale nie dotyczyły . Wiele z nich odnosi się do liczby całkowitej punktu widzenia, która zwykle nie zawiera Not-a-Numbers (
NaN
https://en.wikipedia.org/wiki/NaN) i
-0.0
https://en.wikipedia.org/wiki/Signed_zero
.
Typowe odpowiedzi działają jak do , zwracają .
Zaproponuj zamiast tego tę funkcjonalność: przy zwraca .
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
http://graphics.stanford.edu/~ ... .html
http://graphics.stanford.edu/~ ... rSign
Na tej stronie jest też wiele innych interesujących, zbyt sprytnych rzeczy ...
Anonimowy użytkownik
Potwierdzenie od:
signbit
http://www.opengroup.org/onlin ... .html
(zwraca prawdę, jeśli jej argument jest ujemny).
Nie wiem, dlaczego szczególnie chcesz zwrócić -1 lub +1; copysign jest wygodniejszy
za to, ale wygląda na to, że zwróci +1 dla ujemnego zera na niektórych platformach z
tylko częściowe wsparcie dla ujemnego zera, gdzie signbit ma zwrócić prawdę.
Anonimowy użytkownik
Potwierdzenie od:
Całkiem blisko, prawda?
Anonimowy użytkownik
Potwierdzenie od:
Ponadto uważam, że oba poglądy większości na prawidłowe podejście do definiowania takiej funkcji są w pewnym sensie poprawne, a „kontrowersje” co do niej w rzeczywistości nie są argumentem, biorąc pod uwagę dwa ważne zastrzeżenia:
Jeśli chodzi o C, myślę, że najlepszym sposobem na wyprzedzenie typów całkowitych jest faktyczne użycie wyrażenia , ponieważ musi być tłumaczone bez rozgałęzień i wymaga tylko trzech podstawowych operacji. Najlepszym rozwiązaniem jest zdefiniowanie funkcji wbudowanych, które używają zwracanego typu, który odpowiada typowi argumentu, i dodanie C11 , aby odwzorować te funkcje na wspólną nazwę.
Jeśli chodzi o wartości zmiennoprzecinkowe, myślę, że wbudowane funkcje oparte na C11 , i to właściwa droga, po prostu dlatego, że istnieje duże prawdopodobieństwo, że nie zostaną rozgałęzione, a także nie wymagają rzutowania wyniku w postaci liczby całkowitej z powrotem na zmiennoprzecinkowy. Prawdopodobnie powinieneś zauważyć, że twoje implementacje
signum
zmiennoprzecinkowe nie zwróci zera ze względu na naturę wartości zerowych zmiennoprzecinkowych, względy czasu przetwarzania, a także dlatego, że często jest to bardzo przydatne w arytmetyce zmiennoprzecinkowej, aby uzyskać poprawny znak -1/+ 1, nawet dla wartości zerowych.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
-wtype-limits
.
W przypadku C ++ 11 może istnieć alternatywa.
Dla mnie nie budzi to żadnych ostrzeżeń w GCC 5.3.1.
Anonimowy użytkownik
Potwierdzenie od:
i znalazłem pierwszą funkcję, tę z dwoma argumentami, znacznie bardziej użyteczną ze „standardowej” sgn (), ponieważ najczęściej jest używana w kodzie takim jak ten:
vs.
nie ma rzutowania dla typów bez znaku ani dodatkowego minus.
w rzeczywistości mam ten fragment kodu za pomocą sgn ()
Anonimowy użytkownik
Potwierdzenie od:
Możesz użyć funkcji opakowującej opartej na
szyld z C99
http://www.cplusplus.com/reference/cmath/signbit/
aby uzyskać dokładnie takie zachowanie, jakie chcesz (zobacz kod poniżej).
Zwraca czy znak x jest ujemny.
Można to również zastosować do nieskończonych liczb, NaN i zer (jeśli zero jest bez znaku, jest uważane za dodatnie
<pre class="lang-cpp prettyprint-override">
Uwaga: używam operandu nie („!”), Ponieważ wartość zwracana przez znak bitu nie jest określona jako 1 (chociaż przykłady pozwalają sądzić, że tak będzie zawsze), ale jest to prawda dla liczby ujemnej:
Wartość
Różne od zera (prawda), jeśli znak x jest ujemny; i zero (fałsz) w przeciwnym razie.
Następnie mnożę przez dwa z przesunięciem w lewo („& < <1”), co da nam 2 dla liczby dodatniej i 0 dla liczby ujemnej, a na koniec zmniejszam przez 1, aby otrzymać 1 i -1 dla dodatniej i liczby ujemne, zgodnie z wymaganiami PO.
Anonimowy użytkownik
Potwierdzenie od:
Zwróć uwagę, że zwracanie zmiennoprzecinkowego NAN w przeciwieństwie do zakodowanego na stałe powoduje ustawienie bitu znaku na
niektóre implementacje
http://ideone.com/VulkXo, więc dane wyjściowe dla i będą identyczne bez względu na wszystko (jeśli wolisz wyjście „ ” zamiast możesz wstawić przed powrotem ...)
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Jeśli twoje dane nie zawierają zer jako połowy liczb, wówczas predyktor gałęzi wybierze jedną z gałęzi jako najbardziej powszechną tutaj. Obie gałęzie są związane tylko z prostymi operacjami.
Ponadto w przypadku niektórych kompilatorów i architektur procesora w pełni rozwidlona wersja może być szybsza:
To działa dla
format binarny zmiennoprzecinkowa podwójnej precyzji IEEE 754: binary64
https://en.wikipedia.org/wiki/ ... ary64
.
Anonimowy użytkownik
Potwierdzenie od:
Ta funkcja zakłada, że:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od: