Significantie
het probleem is dat ik niet zou weten hoe ik de antwoorden op de juiste significantie af moet ronden, een som als (f =1/T -> 1/3 = ? zou 0,4 moeten antwoorden aangezien dit een natuurkunde formule is, ik probeer een manier te vinden om altijd de juiste significantie te krijgen.
Kan iemand mij hierbij helpen, want google is geen hulp.
Gewijzigd op 19/01/2014 19:06:30 door php knipper
dat is inderdaad de formule om frequentie mee te berekenen, maar dit helpt niet echt bij mijn probleem :(
Moet je keuzes maken tussen afronden naar boven/beneden/wiskundig?
Het gaat hier denk ik om het bepalen van het aantal significante cijfers. Als je bijvoorbeeld alleen maar getallen van 3 cijfers gebruikt, kan je antwoord nooit met 4 cijfers nauwkeurig worden uitgedrukt.
zoals dat 11.1234 + 4.17 = 15.29
en niet 15.2934 want die laatste 2 cijfers zijn niet nouwkeurig genoeg,
of dat 10.00 * 20.0 = 200 en niet 200.0 want 1 van de getallen is niet nouwkeurig genoeg.
Dit zijn dingen die je gebruikt bij natuurkunde en scheikunde.
Want dan kan je dat vrij eenvoudig met round doen:
Toevoeging op 19/01/2014 21:57:46:
Trouwens wel grappig, 11.1234 is niet nauwkeurig genoeg maar 4.17 wel
ik zei inderdaad iets verkeerd, de 4.17 is niet net zo nauwkeurig gemeten dus dat getal verpest de nauwkeurigheid van 11.1234
Dus als ik het goed begrijp wil je afronden naar het getal met de minste decimalen?
http://nl.wikipedia.org/wiki/Significant_cijfer
Volgens mij zal je van alle getallen het aantal cijfers achter de komma moeten bepalen en dan het kleinste aantal nemen en je resultaat daarop formatten (afronden zo je wilt). Hier staan een aantal methodes om het aantal decimalen te bepalen: http://stackoverflow.com/questions/6619377/how-to-get-whole-and-decimal-part-of-a-number
Ger, het gaat over de wiskundige significantie: Volgens mij zal je van alle getallen het aantal cijfers achter de komma moeten bepalen en dan het kleinste aantal nemen en je resultaat daarop formatten (afronden zo je wilt). Hier staan een aantal methodes om het aantal decimalen te bepalen: http://stackoverflow.com/questions/6619377/how-to-get-whole-and-decimal-part-of-a-number
cijfer | significantie |
123 | 3 |
123.4 | 4 |
0.5 | 1 |
1.0 | 2 |
0.0001 | 1 |
0.0010 | 2 |
3.5E2 | 2 |
en daar zien we dan ook weer meteen het probleem. Als eerste ziet PHP 1.0 gewoon als 1 aan, dus tenzij je met een string werkt (wat niet kan in een formule) zou PHP daar nooit significatie 2 van kunnen maken.
Ten tweede moet je niet slechts het aantal getallen achter de komma tellen en de gene voor de komma, alle nullen aan het begin moeten weggedacht worden.
Als derde zal PHP 3.5E2 als 350 aanzien, wat dus voor significatie 2 en niet 3 wordt aangezien.
En als laatste zal PHP problemen gaan krijgen met het bepalen van de significatie van wiskundige getallen. Als je bijv. pi gaat gebruiken (pi()) dan moet dat niet gebruikt worden, aangezien deze wiskundige oneindigheid heeft. PHP zal dit echter aanzien als een getal met significatie 14. En getallen als 1 / 3 worden ook niet als wiskundig oneindig gezien, maar als significatie 15.
Dus 100% water dicht kun je het niet maken. De meest logische optie voor mij zou zijn om het getal naar een string om te zetten, de komma eruit te slopen, alle nullen ervoor en dan de lengte van de string tellen:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
function sig($number) {
$numberString = (string) $number;
$numberString = preg_replace('/^0+|[.,]/', '', $numberString);
return strlen($numberString);
}
?>
function sig($number) {
$numberString = (string) $number;
$numberString = preg_replace('/^0+|[.,]/', '', $numberString);
return strlen($numberString);
}
?>
Ook deze code werkt niet. Het is dus naar mijn mening onmogelijk de significatie te bepalen, (string) 1.0 geeft namelijk '1' en niet '1.0'. Dus significatie 1, terwijl het 2 moet zijn.
Gewijzigd op 19/01/2014 22:36:26 door Wouter J
1000 is dan ook anders dan 1x10E3.
Significantie van het antwoord gaat anders met +,- dan met *,/ de engelse wikipedia heeft volgens een betere uitleg, toch raar dat niemand weet hoe die met significantie moet omgaan aangezien dit bij HAVO natuurkunde en scheikunde veel nodig is
Raav S op 19/01/2014 23:55:55:
toch raar dat niemand weet hoe die met significantie moet omgaan aangezien dit bij HAVO natuurkunde en scheikunde veel nodig is
Tsja, ze laten iedereen maar achter een computer plaatsnemen tegenwoordig... ;-)
Ik denk dat je er niet aan ontkomt om nog een stap rigoureuzer te werk te gaan dan Wouter beschrijft. Je zal alle gebruikte getallen als vanaf het moment van input als string moeten behandelen (en niet pas converteren naar een string zodra je cijfers moet gaan tellen). Bij een weakly typed taal als PHP kan het nog wel eens een uitdaging zijn om dat goed te doen...
Quote:
Significantie van het antwoord gaat anders met +,- dan met *,/ de engelse wikipedia heeft volgens een betere uitleg, toch raar dat niemand weet hoe die met significantie moet omgaan aangezien dit bij HAVO natuurkunde en scheikunde veel nodig is
Sorry Raav, maar ik weet best wat significatie is, vwo natuur-/scheikunde heeft dat namelijk ook.
En het heeft helemaal niks met +,-,* of / te maken. Significatie gaat om de gegevens die je gebruikt in de formules. Als je meetapparatuur (want daar komen die gegevens vandaan) niet preciezer kan zijn dan significatie 3 dan mag je antwoord ook niet preciezer zijn, hij is immers gebaseerd op een minder precies antwoord. Wat je vervolgens in die berekening doet maakt niks uit.
Wouter J op 20/01/2014 07:44:30:
En het heeft helemaal niks met +,-,* of / te maken.
Dat is niet helemaal waar. Bij optellen en aftrekken kijk je naar het aantal decimalen van het (gemeten) getal met het kleinste aantal significante decimalen. Dus 100,00 + 10,0 wordt 110,0 (en niet 110). Bij vermenigvuldigen en delen kijk je wel naar het totaal aantal significante cijfers van de (ook hier weer gemeten) invoerwaardes.
Maar heeft iemand misschien een idee hoe de de uitkomst significantie van een string als
"(100.00+25.0)*.004*4000"
kan halen, dit zou dus significantie = 1 moeten geven.
Toevoeging op 20/01/2014 21:20:02:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
$som = "20.0*0.010/0.0500";
$som2 = str_replace("*","[x]",$som);
$som2 = str_replace("/","[x]",$som2);
$vars = explode("[x]", $som2);
$sigs = array();
foreach ($vars as $value) {
$vars2 = str_split($value);
$check = true;
$count = 0;
foreach ($vars2 as $value2) {
if ($check) {
if ($value2 != "0") {
if ($value2 != ".") {
$check = false;
}
}
}
if ($check == false) {
if ($value2 != ".") {
$count++;
}
}
}
echo $value." => ".$count."<br />";
array_push($sigs, $count);
}
echo "kleinste significantie : ".min($sigs);
?>
$som = "20.0*0.010/0.0500";
$som2 = str_replace("*","[x]",$som);
$som2 = str_replace("/","[x]",$som2);
$vars = explode("[x]", $som2);
$sigs = array();
foreach ($vars as $value) {
$vars2 = str_split($value);
$check = true;
$count = 0;
foreach ($vars2 as $value2) {
if ($check) {
if ($value2 != "0") {
if ($value2 != ".") {
$check = false;
}
}
}
if ($check == false) {
if ($value2 != ".") {
$count++;
}
}
}
echo $value." => ".$count."<br />";
array_push($sigs, $count);
}
echo "kleinste significantie : ".min($sigs);
?>
dit is een manier om de kleinste significantie te vinden voor keer en gedeeld door sommen, maar ik moet hieraan een manier toevoegen die ook de kleinste significantie van plus en min sommen vind, en rekening kan houden met de reken regels(haakjes gaan voor, dan wortels en machten, dan keer en gedeeld door en daarna pas plus en min sommen uitrekenen)
Toevoeging op 20/01/2014 21:33:09:
dit is bijvoorbeeld een code om het kleinste aantal significante decimalen te berekenden
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$som = "20.0+0.010-0.0500";
$som2 = str_replace("+","[x]",$som);
$som2 = str_replace("-","[x]",$som2);
$vars = explode("[x]", $som2);
$sigs = array();
foreach ($vars as $value) {
$sig = strlen(str_replace(".","", strrchr($value, ".")));
array_push($sigs, $sig);
echo $value." => ".$sig."<br />";
}
echo "kleinste significantie decimalen: ".min($sigs);
?>
$som = "20.0+0.010-0.0500";
$som2 = str_replace("+","[x]",$som);
$som2 = str_replace("-","[x]",$som2);
$vars = explode("[x]", $som2);
$sigs = array();
foreach ($vars as $value) {
$sig = strlen(str_replace(".","", strrchr($value, ".")));
array_push($sigs, $sig);
echo $value." => ".$sig."<br />";
}
echo "kleinste significantie decimalen: ".min($sigs);
?>