Fehler in Berechnung - Negative Zahl wird ab und zu ausgegeben

Dazu muss aber wieder etwas installiert werden und das ganze Script komplett wieder umgeschrieben werden!? Oder sehe ich das falsch?

Die einfachste Lösung wäre warscheinlich, sich einen Server mit 64-Bit-Technologie anzuschaffen oder?
 
Mit 64bit würde es in größere Bereiche gehen ja.

Aber BCMath ist bereits seit PHP4.04 standardmäßig enthalten, also braucht man nichts zu installieren. Möglich wäre es, dass der Hoster es nicht mitkompiliert hat, was aber m. E. n. eher selten der Fall ist.
 
Ja, das wäre eine Möglichkeit.

Folgende Funktion habe ich mal kurz hingekritzelt, ist hatl zu 100% zufällig.

PHP:
<?php

function ezRand($length)
{
	$a = '';
	for($i = 0; $i < $length; $i++)
	{
		$a .= ( $i > 0 ? rand(0, 9) : rand(1, 9) );
	}
	return (string)($a);
}

var_dump(ezRand(20));

?>
 
Ja aber es kann doch nicht sein, dass ein Script nicht mehr funktioniert, sobald man über einen bestimmten Wert kommt!?

Bestimmte Funktionen in PHP werden doch dadurch sinnlos, wenn man eigene Funktionen zum Runden bauen muss, weil die Standartfunktionen dann nicht mehr funktionieren!?

Kann man dass nicht vernünftig lösen...

Das ist für mich die vernünftigste Lösung in den Programmiersprachen ;) Weil intern im Speicher einer Zahl nur eine begrenzte Zahl an Bits zur Verfügung steht um eine gewisse Ordnung zu haben. Und eine negative Zahl wird durch eine voran geschriebene 1 gekennzeichnet.

Bsp: Sagen wir ein Datentyp "Byte" hätte nur 8-Bits und dieser gehe selbstverständlich dann von -128 bis 127.
Dann ist 01111111 + 1 = 10000000 => -128
(da merkt man auch schon warum dem positiven Bereich immer einer fehlt ;) )
Ist jetzt Die Zahl -1 im Speicher und man addiert einen: 11111111 + 1 = 100000000, würde man damit ja außerhalb vom Speicherbereich kommen und dann wäre Chaos dadrin. Also wird daraus 00000000 => 0.
(Kann mir das mal einer Bestätigen oder korrigieren? Bin da grad unsicher)

D.h. aus allem wo rand (); steht bcrand (); machen und die Funktion zu meinen Funktionen hinzufügen?

Jop.
Deine Zahl passt noch in float, also könntest dafür eine Funktion selbst schreiben.
 
Zuletzt bearbeitet:
Aber deine Funktion kann ich doch nicht nutzen, um zwischen 2 Zahlen zu würfeln oder?

Zu der 1. Funktion:

Fatal error: Call to undefined function bcadd()

Wenn ich die Funktion einbaue und nutzen will... :confused:

Kann man eine Rundenfunktion nicht selber bauen, ohne PHP umzukompilieren?
 
Zuletzt bearbeitet:
Schade. Da hast die Erweiterung nicht installiert:
http://de.php.net/manual/de/refs.math.php (BCMath)

Dann musst dir die Zufallsfunktion selbst schreiben, aber dran denken die Zahlen als String zu übergeben. Du kannst auch noch den Float-Bereich nutzen. Nicht vergessen ;)
hatte ich vorhin schon geschrieben und damit ist es auch total einfach

PHP:
function floatrand($start, $end = 0)
{
	return roundfloat(($end - $start) * microtime() + $start);
}

Und da fehlt nun die roundfloat() Funktion die du bitte selbst mal versuchst ;)
PHP:
function roundfloat(float $f)
{
  ...
}

Und wehe es schreibt einer die Lösung. Das ist ne schöne Übung.
Tip: "Anders" runden.

Dabei frage ich mich immernoch warum du so große Zahlen verwendest.
 
Zuletzt bearbeitet:
Ich habe das Problem nun anders gelöst ;)

Kann aber trotzdem nochmal die Lösung posten, wenn du willst... Würde mich trotzdem interessieren, vll. kann man es irgendwann nochmal brauchen! ;)
 
Kurz:
PHP:
function roundfloat($f)
{
	$signum = min(max($f, -1), 1);
	return $signum * floor($signum * $f + 0.5);
}

Oder etwas performanter:
PHP:
function roundfloat($f)
{
	if ($f > 0)
	{
		return ceil($f - 0.5);
	}
	else
	{
		return floor($f + 0.5);
	}
}

Und klar: Wär gut wenn du deine Lösung für die Nachwelt hier auch schreibst.
 
Da gibts nichts großartig zu posten, denn ich habe das Runden einfach weggelassen ;)

Vielen Dank für deine Hilfe ;)
 
Zurück