Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  12 1068
Hei

Jeg har laget en kalkulator med PHP. Dette er en såkalt "Arena kalkulator" som regner ut hvor mange poeng man får hver uke. Dette er, som noen kanskje ser, tatt fra World Of Warcraft. Disse poengene regnes ut av hvor mye "rating" man har.

Problemet er dette regnestykket:
1511.26/(1+1639.28*2.71828^(-0.00412*$Rating))

Om jeg ikke tar feil, er det ^ -tegnet som er feilen. Har lest her og der om mattefunksjoner, men ikke funnet noe i jungelen. Vet noen om dette tegnet skal erstattes med et annet, eller om en php-math funksjon som kan regne det ut i steden for?
- Mange takk på forhånd.



Og hvis noen spør, kan jeg poste koden. Skal oppdatere nettsiden min -nå- så dere kan se den i aksjon om ønsket.
^ tilsvarer typisk XOR operatoren, ikke potens. Regner med det finnes en funksjon power, pow e.l. som du kan bruke i bibliotekene til PHP.
One of the good guys
2rs1's Avatar
http://no.wikipedia.org/wiki/E_(matematikk)

altså:
1511.26/(1+1639.28*e(-0.00412*$Rating))
Sist endret av 2rs1; 30. mai 2008 kl. 13:02.
m0b
m0b's Avatar
DonorAdministrator
Potensregning i php kan du utføre med pow-funksjonen.

http://no2.php.net/pow
@Maddy
Tusen takk, men regnestykket returnerer error, og er ikke komplett.

Det regnestykket jeg viste er
$Formula_A = 1511.26/(1+1639.28*2.71828^(-0.00412*$Rating));

Og du ga meg:
1511.26/(1+1639.28*e(-0.00412*$Rating))

Det mangler *2.7...
Nøyaktig hvordan skal dette skrives?



@|d13m0b
Takk. Den skal jeg sjekke ut. Men den blir et ekstra ledd som jeg vil prøve å unngå.
Altså den matematiske konstanten e=2.7..., så 2.71828^x = e^x
Ser i PHP manualen at du istedenfor pow kan bruke exp funksjonen for å få e^x = exp(x)
http://no2.php.net/exp

Altså blir det 1511.26/(1+1639.28*exp(-0.00412*$Rating))
m0b
m0b's Avatar
DonorAdministrator
Ekstra ledd? Hvordan blir det ekstra ledd?

Kode

1511.26/(1+1639.28*pow( 2.71828, (-0.00412*$rating) );
$Formula_A = 1511.26/(1+1639.28*2.71828^(-0.00412*$Rating));

$Formula_A = 1511.26/(1+1639.28*pow(exp(1), -0.00412*$Rating));

2.71828 er en tilnærmet verdig av den matematiske konstanten e, men det er mest sannsynlig ikke noe viktig å bruke alle desimalene i tallet her...

exp(1) er en funksjon som returnerer 2.71828... osv. ( e^1)

Rot litt mer rudnt med dette hvis det ikke funker.
Aha, jeg misforstod syntaksen for å bruke pow()
Tusen takk |d13m0b, og til dere andre som brukte tid for å hjelpe meg.

Slik ble formelen:

Kode

$Formula_A = 1511.26/(1+1639.28*pow(2.71828, (-0.00412*$Rating)));
Selve kalkulatoren kan dere finne her:
http://leiavmolde.net/aw/?page=calculators&pg=arena



Og her er selve koden:

Kode

<h2>Arena Calculator</h2>
<br />
<br />

<form action="?page=calculators&pg=arena" method="post">

<table>
	<tr>

<?php

echo "<td>Personal Rating:&emsp;</td> <td><input type=\"text\" name=\"PR\" /></td><td>&emsp;".$_POST["PR"]."</td>\n";
echo "</tr><tr>";
echo "<td>Team Rating:</td> <td><input type=\"text\" name=\"TR\" /><td>&emsp;".$_POST["TR"]."</td>\n";
echo "</tr><tr><td>&emsp;</td></tr><tr>";
echo "<td></td><td><input type=\"submit\" value=\"Update\" /></td>";


echo "</tr>\n";
echo "</table>\n";
echo "</form>";

// PR and TR are given their values
$PR = $_POST["PR"];
$TR = $_POST["TR"];



// If TR minus 150 is more than PR then Rating will be PR
IF(($TR-150)>$PR){
	$Rating = $PR;
}
ELSE{
	$Rating = $TR;
}




// A is MoreThanThreshold (1500-*)
// B is LessThanThreshold (0-1499)
$Formula_A = 1511.26/(1+1639.28*pow(2.71828, (-0.00412*$Rating)));
$Formula_B = 0.22*$Rating+14;



// If Rating is 1500 or more, v5 will be set to Formula_A
// If Rating is less than 1500, v5 will be set to Formula_B
IF($Rating > 1500){
	$v5 = $Formula_A;
}
ELSE{
	$v5 = $Formula_B;
}
$v3 = $v5*0.88;
$v2 = $v5*0.76;




echo "<br />\n<br />\n";
echo 'Rating used: '.$Rating;
echo "<br />\n<br />\n";

echo 'Arena Points<br />'."\n";
echo '2v2: '.round($v2)."<br />\n";
echo '3v3: '.round($v3)."<br />\n";
echo '5v5: '.round($v5)."<br />\n";

echo "<br />\n<br />\n";


?>
Sitat av kathedralrose
Aha, jeg misforstod syntaksen for å bruke pow()
Tusen takk |d13m0b, og til dere andre som brukte tid for å hjelpe meg.

Slik ble formelen:

Kode

$Formula_A = 1511.26/(1+1639.28*pow(2.71828, (-0.00412*$Rating)));
Vis hele sitatet...
Bare for å nevne det; tror fortsatt mitt forslag er bedre og et snev raskere:

Kode

$Formula_A = 1511.26/(1+1639.28*exp(-0.00412*$Rating));
Sist endret av rune420; 30. mai 2008 kl. 14:28.
@The Freak

Aha, den var ny for meg. Eller, har ikke hatt matte på en del år da. Men tusen takk!

Da er formelen

Kode

$Formula_A = 1511.26/(1+1639.28*pow(exp(1), (-0.00412*$Rating)));
@rune420

Hehe, okei. Jeg forandret koden og den fungerer. Da har vi 2-3 måter å regne dette stykket på - der jeg regner med resultated vil bli det samme, men belast på serveren vil variere. Uansett hvilket er tyngst og lettest, har dette utrolig lite å si med mindre en million surfere velger å bruke siden min til dette.

Forandret koden til Runes forslag, og så får vi se om dere kommer frem til noen enighet om hvilken som er best og hvorfor.

Tusen takk for all hjelpen!
m0b
m0b's Avatar
DonorAdministrator
Er enig med rune sitt forslag her, som er vesentlig kjappere enn det jeg først skreiv. Jeg tenkte ikke over aritmetikken utenom å bare replikere og gi en løsning til det kathedralrose spurte om.

Laget en liten test for å sammenligne funksjonene med 12345678 iterasjoner.

Kode

kenwi@lnx02 ~ $ php speed.php 12345678
Total: 8.9230020046234, Avg: 7.2276322164108E-7
Total: 4.9012608528137, Avg: 3.9700216163209E-7
@|d13m0b

Det viktigste er at du ga meg en løsning.