Unendlich große Zahlen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
addition
array
bestimmte menge
code
division
duo
entschuldigung
exakt berechnen
genauigkeit
http
mathematiker
mathematiklehrer
multiplikation
negativen zahlen
potenz
programmiert code
rationale zahlen
url
zahl
ziffer
-
Manchmal braucht man als Mathematiker genauigkeit,
das heißt man muss auch riesige Zahlen exakt Berechnen.
Nunja, da ist nur ein Problem:
CPUs können nur eine bestimmte Menge an Daten verarbeiten.
Dafür hab ich jedoch eine Lösung programmiert:
<?php $func_calcStep = 13; //$func_calcStep = 18; //On x64 CPU's function multiplikation($func_one, $func_two) { global $func_calcStep; $func_step = $func_calcStep; $func_calcStep = floor($func_calcStep / 2); //STRREV $func_one = strrev($func_one); //SPLIT $func_one = str_split($func_one, $func_calcStep); //LENGTH $func_len = count($func_one); //RESULT $func_end = array(); //MAINLOOP for($func_i = 0; $func_i < $func_len; $func_i++) { $func_A = strrev($func_one[$func_i]); $func_end[$func_i] = $func_A * $func_two; } transform($func_end); $func_calcStep = $func_step; return strrev(join("", $func_end)); } function transform(&$func_array) { global $func_calcStep; $func_len = count($func_array); for($func_i = 0; $func_i < $func_len; $func_i++) { $func_number = $func_array[$func_i]; if($func_number > pow(10, $func_calcStep)) { $func_toM = substr($func_number, 0, -$func_calcStep); $func_array[$func_i] = substr($func_number, -$func_calcStep); if(!isset($func_array[$func_i + 1])) $func_array[$func_i + 1] = 0; $func_array[$func_i + 1] += $func_toM; } $func_array[$func_i] = strrev($func_array[$func_i]); } } ?>
also wie man sieht - Multiplikation ist für Multiplikation da.
Rein theoretisch kann man unendlich große Zahlen Multiplizieren.
Auf einer Intel Core 2 Duo @ 2GHz hab ich damit eine 44.000 Ziffern große Zahl mit einer 4 Zifferigen in einer Sekunde multipliziert.
Das ganze ist simpel aufgebaut, da die Zahlen in Strings angegeben werden; also wie "98240923"
Eigendlich wird nichts anderes getan als die Zahl in mehrere Stückchen zu zerteilen.
Aus 81389702834 wird zum Beispiel 81|389|702|834
Dann werden die einzelnen Stückchen multipliziert.
Der Nachteil ist nun, dass ich zu faul war rationale Zahlen zu integrieren.
Aber dafür habe ich noch Addition für euch :)
<?php function addition($func_one, $func_two) { global $func_calcStep; //STRREV $func_one = strrev($func_one); $func_two = strrev($func_two); //SPLIT $func_one = str_split($func_one, $func_calcStep); $func_two = str_split($func_two, $func_calcStep); //LENGTH $func_len = (count($func_one) > count($func_two)) ? count($func_one) : count($func_two); //RESULT $func_end = array(); //MAINLOOP for($func_i = 0; $func_i < $func_len; $func_i++) { $func_A = (isset($func_one[$func_i])) ? strrev($func_one[$func_i]) : 0; $func_B = (isset($func_two[$func_i])) ? strrev($func_two[$func_i]) : 0; $func_end[$func_i] = $func_A + $func_B; } transform($func_end); return strrev(join("", $func_end)); } ?>
nunja - an Division arbeite ich noch.
Ich hab bisjetzt schon mal eine Beta Version:
<?php function divide($func_one, $func_two) { $func_index = 0; $func_number = 0; while(isBigger($func_one, $func_number) == 2) { $func_index++; $func_number = addition($func_number, $func_two); } return $func_index; } ?>
Tja, als Entschuldigung das ich so faul bin - hier noch eine coole und manchmal ganz nützliche Funktion:
<?php function isBigger($func_one, $func_two) { global $func_calcStep; $func_false = 0; $func_true = 2; $func_one = strrev($func_one); $func_two = strrev($func_two); $func_one = str_split($func_one, $func_calcStep); $func_two = str_split($func_two, $func_calcStep); $func_len = (count($func_one) > count($func_two)) ? count($func_one) : count($func_two); if(count($func_one) > count($func_two)) return $func_true; if(count($func_one) < count($func_two)) return $func_false; for($func_i = $func_len; $func_i > 0; $func_i--) { $func_A = strrev($func_one[$func_i - 1]); $func_B = strrev($func_two[$func_i - 1]); if($func_A > $func_B) return $func_true; if($func_A < $func_B) return $func_false; } return 1; } ?>
Ohje... Ich war schonwieder Faul:
Ihr seht das "$func_true"?
Nunja...
Es hat einen Sinn! Bei Negativen Zahlen ist das nunmal andersrum:
-82798 ist kleiner als
-82797
Aber ich werd das bald noch verbessern.
Sagt mir was ihr darüber haltet :)
Euer,
AlexRath -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo allrath,
dies habe ich in meinem "Pinseltool" (http://steffens.lima-city.de/pinseltool.php) ebenfalls gelöst; es rechnet unendlich große Potenzen und Divisionen aus. Dies ist nützlich, wenn man einen Mathematiklehrer hat, welcher als Strafarbeit Schüler irrsinnig große Zahlen (von Hand) ausrechnen lässt - mit Zwischenschritten, versteht sich. Also habe ich bei meinem Script das Ganze gelöst, indem ich den Rechenweg nachvollziehe, welchen man zum schriftlichen Multiplizieren bzw. Dividieren benutzt.
Gruß
steffens
Beitrag zuletzt geändert: 8.7.2009 15:24:55 von steffens -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage