2013-10-11 21 views
5

Ich möchte testen, ob eine Zahl positiv oder negativ ist, vor allem auch im Falle von Null. IEEE-754 ermöglicht -0.0, und es ist in Python implementiert.Wie kann ich in Python auf negative Null testen?

def test_sign(x): 
    return math.copysign(1, x) > 0 

Und vielleicht (wahrscheinlich dauert länger laufen):

Die einzigen Abhilfen I Were finden konnte

def test_sign(x): 
    math.atan2(x, -1) 

Ich konnte nicht eine bestimmte Funktion überall in den üblichen Bibliotheken finden, tat Ich übersehe etwas?

Edit: Das ist nicht meine aktuellen Plan mehr, aber wenn die Frage zu stellen Ich habe versucht, eine Funktion überlasten je nachdem, ob ein Argument positiv oder negativ war

(Warum dies relevant ist). Wenn dem Benutzer erlaubt wird, negative Nullen zu übergeben, würde die Mehrdeutigkeit aufgelöst, die für eine Eingabe mit null Werten gedacht war. Und ich denke, dass dies auch für andere Anwendungsfälle von allgemeinem Interesse sein könnte.

+0

möglich Duplikat [negativ Null in Python] (http://stackoverflow.com/questions/4083401/negative-zero-in-python) – Abhijit

+0

Nicht ganz denke ich. @quazgar fragt nach einer Möglichkeit, das Zeichen zu testen, nicht darüber. –

+3

Sie sollten -0 nicht als negativ behandeln, siehe [hier] (https://en.wikipedia.org/wiki/Signed_zero) für einige Erklärungen oder diese Referenzen: [IEEE 754-1985] (http: // www. validlab.com/754R/standards/754.pdf) und [Was jeder Informatiker über Gleitkommaarithmetik wissen sollte] (http://www.validlab.com/goldberg/paper.pdf). –

Antwort

2

Sie könnten die binäre Darstellung verwenden:

import struct 
def binary(num): 
    return ''.join(bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num)) 

kehren Sie den Bitstrom

Das höchste Bit ist das Vorzeichenbit (0 positiv ist, 1 negativ ist)

jedoch IEEE -754 gibt auch an, dass +0,0 == -0,0 == 0,0. So kann nicht sicher sein, dass zum Beispiel -1.0+1.0 zum Beispiel eine positive oder negative Null ergibt.

+1

+1 für die IEEE-754-Notiz: Der Standard besagt, dass die drei "Werte" mathematisch gleich sind, was wichtig zu beachten ist. Da sie gleich sind, suchen Sie nach dem Zeichen ... –

+1

@ DavidBožjak Weil es einer Funktion ermöglichen kann, sich für positive und negative Eingabe unterschiedlich zu verhalten (Stellen Sie sich vor, 1/x zum Beispiel zu plotten).Und das Zeichen der Unendlichkeit kann unterschiedlich sein, je nachdem, ob Sie durch "+ 0.0" oder "-0.0" dividieren. – quazgar

+1

@quazgar: ja. Einige Leute geben jedoch an, dass "1/0.0" "NaN" sein sollte. Und die meisten Leute werden wahrscheinlich zustimmen, dass wenn es einmal das Zeichen einer bestimmten Zahl ermittelt, etwas mit deinem Code nicht stimmt. –

1

Mit dem Modul struct können Sie das Bitmuster direkt testen.

import struct 

def is_neg_zero(n): 
    return struct.pack('>d', n) == '\x80\x00\x00\x00\x00\x00\x00\x00' 

def is_negative(n): 
    return ord(struct.pack('>d', n)[0]) & 0x80 != 0 
Verwandte Themen