[php]rekenen met grote floats

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Als ik een grote float in een variabele stop dan gaat er een boel nauwkeurigheid verloren. Neem ik bv $bla = 8964.0359281437125748502994011976; en ga ik daar mee rekenen dan blijkt $bla slechts 8964.03592814 te bevatten.

$bla * 4 geeft: 35856.1437126
Gebruik ik bcmath dan is het iets beter, maar nog lang niet voldoende(scheelt 1 cijfer :> )
bcmul(4, 8964.0359281437125748502994011976, 500) geeft 35856.14371256
De precision in php.ini aanpassen heeft hier trouwens geen positieve invloed op.

Nemen we de windows calculator erbij dan geeft ie: 35856.143712574850299401197604788 weer, en dat is wel zo ongeveer de nauwkeurigheid die ik nodig heb.


Iemand enig idee hoe dit op te lossen valt?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Welke datatypes heeft PHP zoal voor floating-point values?
Kan je niet eens in de manual kijken, en nagaan welke preciesie ieder type levert.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Had je al met www.php.net/bcscale geknoeit?

[edit]
Dat zou je 500 idd al moeten doen

Owja, tuurlijk...

De parameter wordt al afgekapt, zo gaat het beter:
PHP:
1
2
3
4
<?
        echo bcmul(4, "8964.0359281437125748502994011976", 500);
?>
35856.1437125748502994011976047904

[ Voor 89% gewijzigd door ACM op 20-06-2003 12:25 ]


Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Dat is idd de oplossing, thx :)

Wel vreemd trouwens. Als je een getal als een string opslaat dan kan php wel met de volle lengte van het getal rekenen. En als je het gewoon als getal opslaat weer niet.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nee helemaal niet vreemd. Php rekent helemaal niet met het getal, dat doet de bcmath module. En die wil gewoon dat je twee getallen aanlevert in stringformaat. Als jij die dan als float neerzet (door geen " of ' te gebruiken) komt eerst php eraan en ziet dat het een float is.
Float is te lang -> truncate (past tenslotte niet meer in een 32 of 64bits getalletje) en wordt dan pas aan de bcmath module doorgegeven.
Als je een getal als een string opslaat dan kan php wel met de volle lengte van het getal rekenen. En als je het gewoon als getal opslaat weer niet.
Als je de string meegeeft blijft php er met zijn tengels af en probeert het niet in een float te proppen, als je het als float meegeeft dwing je php er eerst een float van te maken.

Maar php rekent er dus zelf niet mee :)

Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Ah, oki

weer wat geleerd ;)
Pagina: 1