Output the sign

Given a number N, output the sign of N:

• If N is positive, output 1
• If N is negative, output -1
• If N is 0, output 0

N will be an integer within the representable range of integers in your chosen language.

The Catalogue

The Stack Snippet at the bottom of this post generates the catalogue from the answers a) as a list of shortest solution per language and b) as an overall leaderboard.

To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:

## Language Name, N bytes


where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:

## Ruby, <s>104</s> <s>101</s> 96 bytes


If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:

## Perl, 43 + 2 (-p flag) = 45 bytes


You can also make the language name a link which will then show up in the snippet:

## [><>](https://esolangs.org/wiki/Fish), 121 bytes


/* Configuration */

var QUESTION_ID = 103822; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.

/* App */

return "https://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}

jQuery.ajax({
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(a) {
var id = +a.share_link.match(/\d+/);
});
if (!data.has_more) more_answers = false;
comment_page = 1;
}
});
}

jQuery.ajax({
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
});
else process();
}
});
}

var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;

var OVERRIDE_REG = /^Override\s*header:\s*/i;

function getAuthorName(a) {
return a.owner.display_name;
}

function process() {
var valid = [];

var body = a.body;
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});

var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
});
else console.log(body);
});

valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});

var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;

.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)

var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();

languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});

var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);

langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});

for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
language = jQuery(language);
jQuery("#languages").append(language);
}

}
body {
text-align: left !important;
display: block !important;
}

width: 290px;
float: left;
}

#language-list {
width: 500px;
float: left;
}

font-weight: bold;
}

table td {
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<tr><td>Language</td><td>User</td><td>Score</td></tr>
<tbody id="languages">

</tbody>
</table>
</div>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>

</tbody>
</table>
</div>
<table style="display: none">
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
</tbody>
</table>

• This is a trivial challenge with a lot of trivial solutions. There are however some non-trivial solutions too. To voters: Please read the first sentence of this meta post before upvoting builtin functions. Dec 20 '16 at 10:10
• This could probably use a leaderboard. Dec 20 '16 at 11:13
• With a challenge such as this, I'd only be impressed if there was an answer that used less than 1 byte. Say, 5 bits or something. That I would upvote. Dec 22 '16 at 13:13
• @FlipTack Oh, I thought it was codegolf. Dec 28 '16 at 20:23
• @MrLister that's the objective winning criterion. but does it really take more effort to type s for a sign builtin, or use some clever bitshifting/maths to work it out? Have a look at this meta post Dec 28 '16 at 20:25

Brain-Flak, 4846 40 bytes

{([({}<([()])>)]<>(())){({}())<>}}{}({})


Try it Online

Explanation

{                                }{}({}) #Do nothing if zero
({}<([()])>)                          #Put a -1 under input
([            ]<>(()))                  #Put 1 and a negative copy of input on the off stack
{        }        #Until zero
({}())           #Increment
<>         #Swap


Python 3, 20 bytes

Since Python 3 doesn't have access to cmp like Python 2 does, it's a little longer

lambda n:(n>0)-(n<0)

• Practically the same as this answer: codegolf.stackexchange.com/a/103831/41805 Dec 21 '16 at 11:35
• @KritixiLithos practically but it's also an entirely different llanguage Dec 21 '16 at 11:37
• How about n//abs(n) for two bytes Dec 21 '16 at 21:28
• @Dillanm ah, right. Didn't catch that, obvious in hindsight :P Dec 22 '16 at 16:16
• @Dillanm You can, actually, but it's several bytes longer: n and n//abs(n) Dec 23 '16 at 16:19

Befunge 93, 14 13 bytes

Golfed off a byte by combining the 2 1s

1~50p :0_.@.


Try it Online!

This one is interesting, as it takes the first character of the number and alters the code accordingly.

 ~50p         Stores the first character in the space (labeled <char> here)
1    <char>   If the number is negative, it performs subtraction, giving 1 - 0 == -1
If it is 0, 0 is on top. If it is positive, a positive # will be.

:0_         This checks the top number to see if it is positive.
.@       If it is <1, it is printed. (0 or -1)
1     @.      Otherwise, the IP loops back harmlessly, and prints 1


05AB1E, 3 bytes

0.S


Try it online!

• Oh wow! (I mean, how did you get it so long?)
– user85052
Jan 26 '20 at 23:38
• @a'_' Well, there wasn't any way of doing it shorter than this. Jan 27 '20 at 20:36
• Don't use the legacy version and you have 2 bytes Mar 27 '20 at 20:13
• 2 bytes is possible even on the legacy version Apr 24 '20 at 9:59

Labyrinth, 8 bytes

1,_47-%!


Try it online!

I'm posting this as a separate answer because my other Labyrinth answer is based on arithmetic on the actual numerical input value, whereas this mostly ignores the number and works with the character code of the first character instead.

Explanation

So yeah, this reads the first character code which is either 45 (-, which should yield -1), 48 (0, which should yield 0) or 49 to 57 (1-9, which should yield 1). This mapping can be accomplished via the simple formula 1 % (x - 47). To see why this works, here is the breakdown of the code for 3 different examples:

Code    Comment             Example -5      Example 0       Example 5
1       Push 1.             [1]             [1]             [1]
,       Read character.     [1 45]          [1 48]          [1 53]
_47-    Subtract 47.        [1 -2]          [1 1]           [1 6]
%       Modulo.             [-1]            [0]             [1]
!       Print.              []              []              []


The instruction pointer then hits a dead end, turns around and terminates when % now attempts a division by zero.

Another simple computation that works:

x -= 46
x %= x-1


x86_64 machine language on Linux, 13 bytes

 0:   31 c0                   xor    %eax,%eax
2:   85 ff                   test   %edi,%edi
4:   0f 9f c0                setg   %al
7:   c1 ef 1f                shr    $0x1f,%edi 10: 29 f8 sub %edi,%eax 12: c3 retq  The input (first function parameter) is passed into %edi. To try it out, compile and run the following C program #include<stdio.h> #include<stdlib.h> #define s(x) ((int(*)(int))"\x31\xc0\x85\xff\xf\x9f\xc0\xc1\xef\x1f\x29\xf8\xc3")(x) int main(){ printf( "%d %d %d\n", s(-5), s(0), s(44) ); }  • I'm a bit surprised that x86 doesn't have a builtin for sign. – user45941 Dec 23 '16 at 15:00 • Casting a C string to a function pointer? That's nasty. – Nic Dec 26 '16 at 1:08 • @QPaysTaxes, that is also an elegant/horrifying way to make lambdas in C qsort(a,sizeof a/4,4,"\x8b\7+\6\xc3"); Dec 29 '16 at 5:17 • I got virtually the same solution in a language I created that is based off of C lambdas. What C code did you use to generate this machine code? Mar 27 '18 at 18:50 Turing Machine code, 65 bytes 0 0 0 * halt 0 - - r 2 0 * 1 r 3 2 * 1 r 3 3 * _ r 3 3 _ _ * halt  Try it online. • Could you link to an interpreter? – user45941 Dec 23 '16 at 15:00 • couldn't you output using halt state here :P Apr 12 '19 at 7:19 Hexagony, 13 bytes ?</!~/~@$\!@


Expanded:

  ? < /
! ~   /
~ @ $\ ! @ . . . . . .  Try it online! Hexagony truthy/falsiness for numbers checks based on being positive or not. This makes singling out zero a bit tricky, so we check if a number and its negation are both non-positive to check for zero. Uses the unprintable character 0x01 to literally store 1 in a memory edge to save a byte zeroing the edge first. In the expanded version it is between the ~ and the / on the second line. Breakdown: For positive numbers the code is very simple. We start at the top left moving eastward, then take the fork to the right. The rest of the program is "linear" along the surface of the code, giving: ?<0x01\.!@ where both \ and . are no-ops. 0x01 sets the current memory edge to 1 and then ! prints that and @ ends the program. For negative numbers and zero, we start the same but turn left at the <. This leads us back around to the \ but this time approaching from the southwest. This time it acts as a mirror and redirects the instruction pointer westward. The $ allows us to skip the program-ending @. Next we hit ~ which negates the value that we read in. If the number was negative it is now positive, and if it was zero it is still not positive.

When hitting the edge of the hexagon we wrap to the right if the value was positive and to the left if the value was negative or zero. Negative numbers will then wrap to the right and begin moving westwards from the top right. Hitting some mirrors leads us to a familiar looking path starting with the edge being set to 1. Then ~ negates it and ! prints giving -1. We wrap around and hit the other @.

Zero will instead wrap to the bottom, which has nothing but no-ops. Then it wraps back to the middle and is printed by !. Then some mirrors redirect us to the @ to end the program.

Excel, 8 bytes

=Sign(n)


Pretty basic, but the only language I feel complete confidence in.

Without a builtin!

Excel, 23 bytes

=If(n>0,1,If(n<0,-1,0))


not so confident

Crystal Reports Formula (Noncompete), 24 bytes

IIF(n>0,1,IIF(n<0,-1,0))


Minecraft Functions (18w11a, 1.13 snapshots), 131 bytes

Uses a function named a in the minecraft namespace

execute if score @p n matches 0 run say 0
execute if score @p n matches 1.. run say 1
execute if score @p n matches ..-1 run say -1


"Takes input" from a scoreboard objective named n, create it with /scoreboard objectives add n dummy and then set it using /scoreboard players set @p n 8. Then call the function using /function a

Hexagony, 18 15 bytes

~.?>.)<<!!.&,.@


Try it online!

n > 0

  ~ . ?
. . . .
< . ! . .
, . @ .
. . .


n == 0

  ~ . ?
> . ) <
< . ! . &
. . @ .
. . .


n < 0

  ~ . ?
> . ) <
< ! . . .
, . @ .
. . .


Abuses the same EOF trick used in Jo Kings answer.

Sadly I currently don't have access to these neat visual tools used in other solutions.

Vyxal, 1 byte

±


Try it Online!

Nothing special, just a built-in, but nobody else had posted it yet, so I figured I might as well.

No built-in, 72 bytes

Thanks to @Bubbler for saving 5 bytes.

ȧ/


Try it Online!

Does |x| / x. In Vyxal, 0 / 0 returns 0 instead of a divide by zero error, so this works.

• hey, have you seen this bounty? Because you're eligible for it Apr 21 '21 at 5:11
• Non-trivial 6 bytes ((x>0) - (x<0)) and 4 bytes (max(min(x,1),-1)) Apr 21 '21 at 5:13
• 2 bytes (x/abs(x)), which happens to not error on 0. Apr 21 '21 at 5:23
• @Bubbler the fact that it doesn't error on division by 0 is intentional. I added that a while ago Apr 21 '21 at 6:13

Mathematica, 28 bytes

Limit[2ArcTan@x#/Pi,x->∞]&


Mathematica, 30 bytes

2HeavisideTheta@#-1/._[_]->1/2&


Mathematica, 76 bytes

Round@Integrate[E^(2#+I t#)/(2+I t)/Pi,{t,-∞,∞},PrincipalValue->True]-1&


Just to be different :)

• Median@{#,1,-1} and #~Min~1~Max~-1 if you want some more ideas ;) Dec 20 '16 at 12:09
• Personal challenge to you: find an implementation that's longer than 76 bytes, but fully golfed for its algorithm (can you be turned to the dark side?!). Dec 20 '16 at 18:43
• Can I take you up on this challenge? Dec 20 '16 at 23:29
• Of course! .. :) Dec 21 '16 at 0:13

Forth, 22 bytes

Golfed

: S dup 0< swap 0> - ;


Test

: S dup 0< swap 0> - ;  ok

0 S . 0  ok
1 S . 1  ok
-1 S . -1  ok
12345 S . 1  ok
-12345 S . -1  ok


Try It Online !

• Nice. I was going to post something similar that I wrote several months ago. Dec 20 '16 at 22:38

Plain English101 81 bytes

To put a n number's sign into a s number:
Get the sign of the n returning the s.


Ungolfed version:

To put a number's sign into another number:
Get the sign of the number returning the other number.


Either version can be used to golf the client code -- and make the client code more readable. For example, the following line of code displays a Windows message box containing the number -1 in the message body:

Debug -456's sign.


The Plain English IDE is available at github.com/Folds/english. The IDE runs on Windows. It compiles to 32-bit x86 code.

• ... I don't think that the Ungolfed version was really necessary Aug 1 '17 at 18:36

LOLCODE, 191 bytes

HAI 1.3
I HAS A J ITZ A NUMBR
GIMMEH J
BIGGR OF J AN 0, O RLY?
YA RLY
VISIBLE "1"
NO WAI
BOTH SAEM "0" AN J, O RLY?
YA RLY
VISIBLE "0"
NO WAI
VISIBLE "-1"
OIC
OIC
KTHXBYE


Try it online!

• This is surprisingly readable. Nov 21 '17 at 18:17
• @iamnotmaynard funny right? Nov 21 '17 at 19:31

Befunge-93 (PyFunge), 12 bytes

~"1"%90p1X.@


Try it online!

Note that the X can be anything (except a new line), as it gets written over during run-time. It's just easier for explanation

Similar to my other Befunge answer, but this time it mods the first character by the ASCII for 1 first, so that a positive first digit will turn into a no-op, leaving the 1 on the top of the stack:

~               Read the first *character* of input - either a digit or "-"
"1"%           Mod the character by the ASCII value of 1. After this step, the character
is a '-' for negative numbers, '0' for 0, and small, unprintable
characters for positive numbers

90p        Puts the character in the space with the X.
1       Pushes a 1

X      3 different options based on the character that was put here:
-      Negative: Subtract the 1 from the implicit 0 to get -1
0      Zero:     Push 0
Positive: A no-op, which leaves the 1 on top

.     Prints out the top of the stack
@    Ends the program


Hexagony, 16 bytes

...!/~.?.<.!1@.,


Try it online!

Not much smaller than the previous answer, but strangely elegant in comparison.

Expanded:

   . . .
! / ~ .
? . < . !
1 @ . ,
. . .


TIS-n11, 57 bytes

@0
MOV UP ACC
SUB 998
SUB 998
MOV ACC ANY


Try it online!

The integral data type supported by TIS ranges from -999 to 999. Any value in input, code, or calculations is silently coerced (clamped) into that range (instead of truncation, overflowing, etc.).

So, by adding 998 to any number, then subtracting the same amount, it becomes 1 is it was positive, and stays untouched otherwise. We then do the same to coerce all negative numbers to -1.

We need to subtract across two separate operations, due to the coercion mentioned above.

If you are familiar with TIS-100, you will be used to a 3x4 array of computational nodes, however, this solutions only uses one such node, nominally taking input from above and giving it below.

Python 3, 30 bytes

Just here to share another solution.

lambda x:eval(f'x and {x}**0')


Try it online!

Explanation

lambda x:                      # Lambda function with the variable x
eval(f'      {x}**0') # Raise x to the power of 0
x and          # Since 0 ** 0 = 1, we prevent that
# by using logical and.


Python 3, 26 25 bytes

An interesting way to approach this problem using the irregularity of Python 3 hash function.

lambda x:x/abs(~hash(~x))


Try it online!

Explanation

The big idea is to return x/abs(x). However, this causes division by 0 if x is 0.

hash(i) (where $$\i\$$ is an integer) returns $$\i\$$ most of the time, with the exception of hash(-1) returning $$\-2\$$. Thus ~hash(~x) (where ~ denotes bitwise negation) evaluates to:

• If x != 0: ~hash(~x) == ~~x == x
• If x == 0: ~hash(~0) == ~hash(-1) == ~(-2) == 1

Thus instead of dividing by abs(x), we divides by abs(~hash(~x)) which can never be 0.

Note: This will not work for large integers ($$\\ge2^{61}\$$), since hash of long integer is calculated differently.

Mornington Crescent, 20602054 1246 bytes

The improved solution is here!

Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Parsons Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take District Line to Acton Town
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Holborn
Take Central Line to Holborn
Take Central Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Acton Town
Take District Line to Parsons Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Central Line to Holborn
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Holborn
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Leicester Square
Take Northern Line to Leicester Square
Take Northern Line to Mornington Crescent


Try it online!

The algorithm:

1. Parse an integer out of the string provided as input at Parsons Green.
2. Take the two's complement of the result of step 1 at Notting Hill Gate.
3. Compute the value of 1 by dividing the result of step 2 by itself.
4. Take the two's complement of 1 to get -2.
5. Take the greater of -2 and the result of 2.
6. Take the two's complement of the result of step 5.
7. Parse an integer out of a string that contains no integer at Parsons Green, yielding 0.
8. Take the two's complement of 0 to get -1.
9. Take the greater of -1 and the result of step 6.
10. Output the result. In conclusion, the program clamps the integer between the values of -1 and 1, similarly to other solutions.

Old solution:
Took me the better part of two days to figure it out, but I think I have it. The program does not function correctly if faced with -0 or 03 as inputs, so its preconditions are such that there are no leading zeros in the input and that -0 is invalid as well.

Take Northern Line to Charing Cross
Take Northern Line to Charing Cross
Take Northern Line to Bank
Take Circle Line to Bank
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Green Park
Take Victoria Line to Green Park
Take Piccadilly Line to Russell Square
Take Piccadilly Line to Russell Square
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Victoria
Take District Line to Upminster
Take District Line to Upney
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Cannon Street
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Upminster
Take District Line to Upney
Take District Line to Cannon Street
Take District Line to Upney
Take District Line to Cannon Street
Take District Line to Upney
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Acton Town
Take District Line to Upney
Take District Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Barking
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Barking
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent


Try it online!

The algorithm:

1. Get the first character of the input, which should be - if negative, 0 if zero, or any other digit 1 through 9 if positive.
2. Convert to ASCII. Now the program should have 45 if the input was negative, 48 if the input was zero, and an integer between 49 and 57 if the input was positive.
3. Take the bitwise NOT of the ASCII integer. Now the program should have -46 if the input was negative, -49 if the input was zero, and an integer between -50 and -58 if the input was positive.
4. Add 49 to the previous integer. Now the program should have 3 if the input was negative, 0 if the input was zero, and an integer between -1 and -9 if the input was positive.
5. Complete integer division by 3. Now the program should have 1 if the input was negative, 0 if the input was zero, and an integer between -1 and -3 if the input was positive.
6. Take the maximum function of the previous integer and -1 (taking whichever is larger). Now the program should have 1 if the input was negative, 0 if the input was zero, and -1 if the input was positive.
7. Take the bitwise NOT of the previous integer. Now the program should have -2 if the input was negative, -1 if the input was zero, and 0 if the input was positive.
8. Add one to the previous integer. Now the program should have -1 if the input was negative, 0 if the input was zero, and 1 if the input was positive. We are done.

Overall, a very rewarding but tiring experience.

EDIT, -6 bytes: Changed Embankment to the shorter Barking.

• Just realized there is a much better algorithm to do this. You can use max, bitwise not, max again, and bitwise not again. Oops... that's work for tomorrow. Apr 23 '20 at 1:51

Clojure, 14 bytes

#(compare % 0)


This uses the built-in compare function of clojure: it returns a 1 if the first arg is greater than the second arg, 0 if it's equal, and -1 if it's smaller.

Usage:

(#(...) {number})


signum


Just a boring built-in.

Perl 6, 9 bytes

+(*cmp 0)


Try it online!

Explanation:

+(     # turn into a number

*    # Whatever (input)
cmp  # compared to
0    # 0

)


CJam, 1 byte

g


Try it online!

Another built-in, just for the sake of completeness.

Wonder, 4 bytes

sign


Usage:

sign 1


Builtin.

Bonus solution (no builtin), 7 bytes

tt cmp0


Usage:

(tt cmp0)5


Uses a compare function with 0.

Javascript, 18 bytes

x=>x/Math.abs(x)|0


x/Math.abs(x) is always 1 if x is positive and -1 if x is negative. If x is 0, it returns Nan, which we transform to 0 with the |0 bit.

Gema, 9 characters

Just a rewrite of Jordan's Sed solution.

0=0
<D>=1


Sample run:

bash-4.3$gema '0=0;<D>=1' <<<$'-303\n-12\n-5\n0\n1\n20\n404'
-1
-1
-1
0
1
1
1


Gema, 19 characters

*=@cmpn{*;0;-1;0;1}


Posted just because Gema has a nice function for this task:

@cmpn{number;number;less-value;equal-value;greater-value}
Compare numbers.

Sample run:

bash-4.3$gema '*=@cmpn{*;0;-1;0;1}' <<< -303 -1 bash-4.3$ gema '*=@cmpn{*;0;-1;0;1}' <<< 0
0

bash-4.3\$ gema '*=@cmpn{*;0;-1;0;1}' <<< 404
1


Batch, 23 bytes

@cmd/cset/a"%1>>31|!!%1


>>31 evaluates to -1 if the input is negative and 0 if it is positive, while !! evaluates to 1 if it is nonzero and 0 if it is zero, so we just have to bitwise OR the two results together.