PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : programmieren mit c mit -1 multiplizieren



adVenturer
05.12.2012, 16:37
float berechne(float a, float b){
//ax+b=0
if(b < 0)
b = b * (-1);
return b / a;
}

Geht das wenn ich die variable b mit "* (-1)" so negiere? Oder gibbet es da für c eine funktion?

Die gleichung mus nach x aufgelöst werden.

aleator
05.12.2012, 17:01
float berechne(float a, float b){
//ax+b=0
if(b < 0)
b = b * (-1);
return b / a;
}

Geht das wenn ich die variable b mit "* (-1)" so negiere? Oder gibbet es da für c eine funktion?

Die gleichung mus nach x aufgelöst werden.
Du kannst auch


b*=-1;

schreiben, das ist wohl das kürzeste...

Oder du schreibst gleich

return(-b/a);

Du solltest allerdings noch ausschließen das a=0 sonst stürzt das Programm ab.
Was soll denn das (if(b<0))?

adVenturer
05.12.2012, 17:03
yo das mit a ist schon berücksichtigt, jedenfalls danke für die alternativen.

Das mit dem" (if(b<0))?" war nen knick in der logik

Sumpfkrautjunkie
05.12.2012, 17:18
Für den Betrag gibts eine eingebaute Funktion:
http://www.cplusplus.com/reference/cmath/fabs/

prinzipiell kannst du das auch händisch (am Spaß an der Freude) mit Bitoperationen machen und das Vorzeichenbit auf 0 setzen:

float berechne(float a, float b){
return (b / a) & (~(1<<31));
}

Oder generell für Vorzeichenwechsel das Vorzeichenbit über xor mit einer 1 verknüpfen (wenn vorzeichenbit 0 ist, dann ist die zahl positiv, bei 1 negativ):

float berechne(float a, float b){
return (b / a) ^ (1<<31);
}

Lookbehind
05.12.2012, 17:26
...
prinzipiell kannst du das auch händisch (am Spaß an der Freude) mit Bitoperationen machen und das Vorzeichenbit auf 0 setzen:

float berechne(float a, float b){
return (b / a) & (~(1<<31));
}

Oder generell für Vorzeichenwechsel das Vorzeichenbit über xor mit einer 1 verknüpfen (wenn vorzeichenbit 0 ist, dann ist die zahl positiv, bei 1 negativ):

float berechne(float a, float b){
return (b / a) ^ (1<<31);
}
Einfach nur das erste (oder letzte, je nach dem von wo man guckt) Bit auf 1 oder 0 setzen machts aber auch nicht richtig.
0000...0001 ist die Positive 1, tauscht man jetzt das Vorzeichen durch ändern des ersten Bits auf 1000...0001, so hat man nicht die Minus-Eins, sondern Minus Zwei-Milliarden-Irgendwas ;)

Sumpfkrautjunkie
05.12.2012, 17:38
Einfach nur das erste (oder letzte, je nach dem von wo man guckt) Bit auf 1 oder 0 setzen machts aber auch nicht richtig.
0000...0001 ist die Positive 1, tauscht man jetzt das Vorzeichen durch ändern des ersten Bits auf 1000...0001, so hat man nicht die Minus-Eins, sondern Minus Zwei-Milliarden-Irgendwas ;)
es geht hier um IEEE754 floats, nicht um integer im 2er kompliment;)

aleator
05.12.2012, 17:46
es geht hier um IEEE754 floats, nicht um integer im 2er kompliment;)
Wieso einfach wenns auch kompliziert geht? :o

die fabs() funktion geht aber nicht. Wir wollen ja negieren und nicht nur den betrag. (Es sei denn man lässt das if(b<0) und schreibt dann entsprechend um was aber wiederum ein Mehraufwand wäre) :dnuhr:

Sumpfkrautjunkie
05.12.2012, 17:59
Wieso einfach wenns auch kompliziert geht? :o
Prinzipiell sollte das ein Compiler selbst passend optimieren können. Aber man kann ja auch mal angucken, wie man das eventuell (ohne Berücksichtigung des compilers) in der reinen Theorie effizienter implementieren kann:p
(insbesondere wenn man GPGPU Programme schreiben will und bedenkt, das GPUs etwas allergisch auf if-statements reagieren (die haben für solchen Kram aber natürlich auch schon eigene eingebaute Funktionen))


die fabs() funktion geht aber nicht. Wir wollen ja negieren und nicht nur den betrag. (Es sei denn man lässt das if(b<0) und schreibt dann entsprechend um was aber wiederum ein Mehraufwand wäre) :dnuhr:

Was weiß ich was das ziel ist :p Wenn da schon ein if(b < 0) b = b * (-1); steht, geh ich halt natürlicherweise vom Betrag aus :dnuhr:

adVenturer
05.12.2012, 18:03
aleator hat schon recht, ich wollte das ding nur negieren. Macht ja auch sinn, wenn man eine gleichung umstellen will.

adVenturer
05.12.2012, 20:06
Ich brauch nochmal eure hilfe.

gibt es ne möglichkeit ne variable die als float deklariert ist auf NULL zu setzen?

also z.b

float bla = NULL;

is aber nen fehler weil float.

Lehona
05.12.2012, 20:09
Ein float ist ein primitiver Datentyp, warum sollte der NULL sein können? Das ist doch ein (Null-)pointer?

Matteo
05.12.2012, 20:14
Ein primitiver Datentyp kann eigentlich nicht NULL sein.
In Java gibt es aber sog. Wrapper-Klassen, in die du primitive Datentypen "einpacken" kannst und die du dann wie andere Klassen behandeln kannst.
Ob es für c so etwas auch gibt, weiß ich nicht.

Khadron
06.12.2012, 13:41
Was weiß ich was das ziel ist :p Wenn da schon ein if(b < 0) b = b * (-1); steht, geh ich halt natürlicherweise vom Betrag aus :dnuhr:
§ugly