Quando in PHP devono essere usate funzioni aritmetiche di precisione arbitrarie?

7

Il mio collega utilizza le funzioni del calcolatore binario nei calcoli della larghezza di banda; tanto quanto i terrabyte, e con la divisione percentuale sull'assegnazione. Il suo uso di queste funzioni sembra corretto per non perdere un byte; anche se sembra che li stia usando ora per tutto.

Il manuale dice solo:

For arbitrary precision mathematics PHP offers the Binary Calculator which supports numbers of any size and precision, represented as strings.

Quanto costa una taglia? È davvero necessario? Quanto è grande il float predefinito in PHP? Ci sono dei buoni consigli su questo o su cose da tenere a mente?

    
posta Tjorriemorrie 29.12.2011 - 09:36
fonte

5 risposte

12

La dimensione degli interi in PHP è dipendente dalla piattaforma .

The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). 64-bit platforms usually have a maximum value of about 9E18. PHP does not support unsigned integers. Integer size can be determined using the constant PHP_INT_SIZE, and maximum value using the constant PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5.

La dimensione dei float, è anche dipendente dalla piattaforma :

The size of a float is platform-dependent, although a maximum of ~1.8e308 with a precision of roughly 14 decimal digits is a common value (the 64 bit IEEE format).

e nel manuale c'è un grosso avvertimento rosso sulla precisione del galleggiante:

Floating point numbers have limited precision. Although it depends on the system, PHP typically uses the IEEE 754 double precision format, which will give a maximum relative error due to rounding in the order of 1.11e-16. Non elementary arithmetic operations may give larger errors, and, of course, error progragation must be considered when several operations are compounded.

Additionally, rational numbers that are exactly representable as floating point numbers in base 10, like 0.1 or 0.7, do not have an exact representation as floating point numbers in base 2, which is used internally, no matter the size of the mantissa. Hence, they cannot be converted into their internal binary counterparts without a small loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8, since the internal representation will be something like 7.9999999999999991118....

L'estensione Math Math ignora le dipendenze, consentendo di specificare esplicitamente un intero grande come una stringa ed evitare l'interpretazione di PHP di valori letterali interi. Le funzioni GMP sono anche buone alternative e funzionano in modo simile. Possiamo tranquillamente supporre che any size si riferisca alla dimensione massima delle stringhe, che è limitata solo da disponibile memoria :

It is no problem for a string to become very large. PHP imposes no boundary on the size of a string; the only limit is the available memory of the computer on which PHP is running.

Se ha senso o no, può essere deciso solo in base al singolo caso. Non ho mai notato problemi di prestazioni effettive con le funzioni dell'estensione, ma sicuramente non sono veloci quanto le alternative native.

Is it really necessary?

È necessario solo quando lo è, ma non è sempre ovvio. È possibile identificare facilmente l'abuso palese, ma non può facilmente argomentare su scenari più complessi.

Parla con il tuo collega e scopri perché li usa ovunque . Gli overflow portano a situazioni estremamente brutte, che trovo abbastanza difficili da identificare e risolvere. Se sta abusando di BC Math, potrebbe essere solo perché è rimasto orribilmente bloccato una volta e cerca di giocare nel modo più sicuro possibile. Sebbene non ci sia nulla di intrinsecamente sbagliato nell'usare BC Math, la pena di performance altrimenti insignificante potrebbe essere un problema serio in diversi scenari. Se noti problemi di prestazioni, assicurati di profilare la tua applicazione e assicurati che sia collegato a BC Math.

Ricorda sempre che i tuoi calcoli dovrebbero funzionare correttamente:

  • Su ogni sistema a cui sei destinato, macchine per sviluppatori individuali e (ovviamente) macchina di produzione inclusa.
  • Indipendentemente dai possibili aggiornamenti di sistema / piattaforma o downgrade.

Nello sviluppo multipiattaforma devi sempre considerare il limite più basso come limite rigido. Se sei assolutamente certo che i tuoi calcoli non vadano oltre i limiti (compresi i loro risultati), allora non ha senso usare BC Math.

Ma se quello che stai descrivendo è che preferisce echo bcadd("1", "2"); oltre echo 1+2; , beh, buona fortuna!

Ho trovato un & estremamente interessante; post sul blog pertinente nella mia enorme lista di segnalibri, Interi in PHP, in esecuzione con le forbici e la portabilità , sul blog Performance di MySQL di Percona. È vecchio (2007) ma offre una buona panoramica dei vari snafus con portabilità intera in PHP.

    
risposta data 29.12.2011 - 09:40
fonte
4

Are there any good advice regarding this or things to keep in mind?

L'uso delle funzioni matematiche di BC in PHP presenta vantaggi e svantaggi.

Vantaggi:

  • puoi eseguire calcoli di base su numeri con "numeri di qualsiasi dimensione e precisione".

Svantaggi:

    Il calcolo
  • non è nativo (i calcoli su Integer o Float sono nativi di PHP e spesso CPU nativi)
  • numeri da gestire come stringhe
  • Il codice
  • non è facile da leggere

Quindi possiamo vedere che BC Math è riservato per un uso specifico e può offuscare le formule e persino gli algoritmi, e anche rallentare calcoli massicci.

Quindi è una buona idea capire i calcoli aziendali per capire quando tali funzioni sono veramente necessarie e dove sono inutili. Quindi qui devi concentrarti sulla velocità del codice e sulla leggibilità del codice. Quindi è opportuno scegliere la convenzione di codifica del progetto sull'uso di BC Math.

Per fare ciò, devi comprendere le differenze tecniche tra i calcoli nativi di PHP e la funzione Math Math. Questa è la tua domanda "Quanto è grande qualsiasi dimensione? Quanto è grande il float predefinito in PHP?"

How much is any size?

Non possiamo trovare molta documentazione sulla sua. Probabilmente finché una stringa può essere in PHP.

How big is the default float in PHP?

"La dimensione di un float dipende dalla piattaforma, sebbene un massimo di ~ 1,8e308 con una precisione di circa 14 cifre decimali sia un valore comune (il formato IEEE a 64 bit)."

Maggiori dettagli sul manuale PHP .

Nota che PHP fornisce anche GMP Funzioni che eseguono calcoli su interi grandi.

    
risposta data 29.12.2011 - 10:59
fonte
1

Trovo che bcmath sia molto più amichevole da usare rispetto a GMP. Finora non sono nemmeno riuscito a scoprire come gestire i calcoli in virgola mobile con GMP in PHP. Tutte le cose in virgola mobile sembrano essere state omesse nella versione di PHP. Quindi rimango con bcmath (per ora).

GMP su PHP sembra essere orientato verso calcoli di teoria dei numeri e non calcoli numerici come i decimali di pi (o e) e simili.

    
risposta data 29.10.2012 - 10:41
fonte
0

"Ci sono dei buoni consigli su questo o su cose da tenere a mente?"

Non esiste un vero sostituto per:

  1. conoscendo i limiti della tua piattaforma PHP e

  2. comprensione dei requisiti di calcolo del tuo problema.

Inoltre, una certa comprensione della matematica del calcolo è sempre utile.

    
risposta data 26.01.2014 - 07:55
fonte
0
"When must arbitrary precision arithmetic functions be used in PHP?"

Non ho mai sentito parlare di un sito che deve utilizzare le funzioni di bcmath in PHP per quelle che potrebbero essere considerate normali prassi e tenere presente che la maggior parte dei siti più grandi sull'uso di Internet utilizza una notevole quantità di PHP e oltre 240 milioni di i siti "più piccoli" sono codificati usando PHP.

bcmath viene in genere utilizzato per casi estremi in cui è probabile che i numeri diventino molto grandi o molto piccoli, piuttosto che situazioni in cui è necessario un 'long' piuttosto che un int, o quando la dimensione specifica di un int o float è un preoccupazione.

"How much is any size?"

bcmath è limitato solo dalla memoria, e in realtà non si tratta di una vera limitazione. Un rapido test con bcmath mostra che può gestire numeri superiori a 2 ^ 1000000 (ovvero 301.030+ cifre, un milione è solo sette cifre) e '0.1 - 2 ^ 1000000' che si traduce in un negativo di proporzioni uguali.

Per quanto riguarda le prestazioni, bcmath è veloce ma può consumare molta memoria. In pratica calcola i numeri nello stesso modo in cui vorremmo (come esseri umani) usando una penna nel pad. I numeri realistici possono essere elaborati in poche centinaia di passaggi, in genere in pochi millisecondi. Ma queste "poche centinaia" di stringhe si sommano in memoria. Nota che i numeri sopra (2 ^ 1000000) sono incredibilmente grandi e prendi il mio computer portatile abbastanza vecchio per 2-3 secondi.

"Is it really necessary?"

In breve, sì, ma molto raramente.

Ad esempio, gli hash SHA-1 sono in realtà numeri, non stringhe. Il numero più alto possibile utilizzando SHA-1 è 2 ^ 160 o 1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,976. Non c'è modo di lavorare con questi numeri usando i tipi di dati nativi e lavorare con gli hash SHA-1 (come numeri) è abbastanza comune negli algoritmi distribuiti.

Ancora una volta, questo è raro, ma quando è necessario non c'è davvero un sostituto, indipendentemente dal tuo sistema o dalla tua struttura di preferenza.

"Advise"

Non usare bcmath a meno che tu non sappia che è ciò di cui hai bisogno o semplicemente divertiti a giocare con i numeri. Non si romperà nulla e non dovrebbe causare problemi di prestazioni evidenti, ma la maggior parte dei problemi può essere risolta utilizzando i tipi di dati standard di PHP.

    
risposta data 26.01.2014 - 06:18
fonte

Leggi altre domande sui tag