GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Downloads
  • Documentation
  • Get Involved
  • Help
  • Getting Started
  • Introduction
  • A simple tutorial
  • Language Reference
  • Basic syntax
  • Types
  • Variables
  • Constants
  • Expressions
  • Operators

This view

  • Original page
  • New address

GeezerVison is showing www.php.net — PHP: BC Math - Manual

PHP 8.6.0 RC5 available for testing
    Installing/Configuring »
    « Mathematical Extensions
    • Preface
    • Function Reference
    • Mathematical Extensions

    BCMath Arbitrary Precision Mathematics

    Introduction

    For arbitrary precision mathematics PHP offers BCMath which supports numbers of any size and precision up to 2147483647 (or 0x7FFFFFFF) decimal digits, if there is sufficient memory, represented as strings.

    Valid (aka. well-formed) BCMath numbers are strings which match the regular expression /^[+-]?[0-9]*(\.[0-9]*)?$/.

    Caution

    Passing values of type float to a BCMath function which expects a string as operand may not have the desired effect due to the way PHP converts float values to string, namely that the string may be in exponential notation (which is not supported by BCMath), and that, prior to PHP 8.0.0, the decimal separator is locale dependent (while BCMath always expects a decimal point).

    <?php
    $num1 = 0; // (string) 0 => '0'
    $num2 = -0.000005; // (string) -0.000005 => '-5.05E-6'
    echo bcadd($num1, $num2, 6); // => '0.000000'
    
    setlocale(LC_NUMERIC, 'de_DE'); // uses a decimal comma
    $num2 = 1.2; // (string) 1.2 => '1,2'
    echo bcsub($num1, $num2, 1); // => '0.0'
    ?>
    • Installing/Configuring
      • Installation
      • Runtime Configuration
    • BC Math Functions
      • bcadd — Add two arbitrary precision numbers
      • bcceil — Round up arbitrary precision number
      • bccomp — Compare two arbitrary precision numbers
      • bcdiv — Divide two arbitrary precision numbers
      • bcdivmod — Get the quotient and modulus of an arbitrary precision number
      • bcfloor — Round down arbitrary precision number
      • bcmod — Get modulus of an arbitrary precision number
      • bcmul — Multiply two arbitrary precision numbers
      • bcpow — Raise an arbitrary precision number to another
      • bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
      • bcround — Round arbitrary precision number
      • bcscale — Set or get default scale parameter for all bc math functions
      • bcsqrt — Get the square root of an arbitrary precision number
      • bcsub — Subtract one arbitrary precision number from another
    • BcMath\Number — The BcMath\Number class
      • BcMath\Number::add — Adds an arbitrary precision number
      • BcMath\Number::ceil — Rounds up an arbitrary precision number
      • BcMath\Number::compare — Compares two arbitrary precision numbers
      • BcMath\Number::__construct — Creates a BcMath\Number object
      • BcMath\Number::div — Divides by an arbitrary precision number
      • BcMath\Number::divmod — Gets the quotient and modulus of an arbitrary precision number
      • BcMath\Number::floor — Rounds down an arbitrary precision number
      • BcMath\Number::mod — Gets the modulus of an arbitrary precision number
      • BcMath\Number::mul — Multiplies an arbitrary precision number
      • BcMath\Number::pow — Raises an arbitrary precision number
      • BcMath\Number::powmod — Raises an arbitrary precision number, reduced by a specified modulus
      • BcMath\Number::round — Rounds an arbitrary precision number
      • BcMath\Number::__serialize — Serializes a BcMath\Number object
      • BcMath\Number::sqrt — Gets the square root of an arbitrary precision number
      • BcMath\Number::sub — Subtracts an arbitrary precision number
      • BcMath\Number::__toString — Converts BcMath\Number to string
      • BcMath\Number::__unserialize — Deserializes a data parameter into a BcMath\Number object

    Found A Problem?

    Learn How To Improve This Page • Submit a Pull Request • Report a Bug
    +add a note

    User Contributed Notes 3 notes

    up
    down
    82
    Hayley Watson ¶
    11 years ago
    This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.
    up
    down
    23
    volek at adamv dot cz ¶
    11 years ago
    Note that when you use implementation of factorial that ClaudiuS made, you get results even if you try to calculate factorial of number that you normally can't, e.g. 2.5, -2, etc. Here is safer implementation:
    <?php
    /**
     * Calculates a factorial of given number.
     * @param string|int $num
     * @throws InvalidArgumentException
     * @return string
     */
    function bcfact($num)
    {
        if (!filter_var($num, FILTER_VALIDATE_INT) || $num <= 0) {
            throw new InvalidArgumentException(sprintf('Argument must be natural number, "%s" given.', $num));
        }
    
        for ($result = '1'; $num > 0; $num--) {
            $result = bcmul($result, $num);
        }
    
        return $result;
    }
    ?>
    up
    down
    21
    ClaudiuS ¶
    13 years ago
    Needed to compute some permutations and found the BC extension great but poor on functions, so untill this gets implemented here's the factorial function:
    
    <?php
    /* BC FACTORIAL
     * n! = n * (n-1) * (n-2) .. 1 [eg. 5! = 5 * 4 * 3 * 2 * 1 = 120]
     */
    function bcfact($n){
        $factorial=$n;
        while (--$n>1) $factorial=bcmul($factorial,$n);
        return $factorial;
    }
    
    print bcfact(50); 
    //30414093201713378043612608166064768844377641568960512000000000000
    ?>
    +add a note
    • Mathematical Extensions
      • BC Math
      • GMP
      • Math
      • Statistics
      • Trader
    You are visitor 01402503 — GeezerVison does not store the pages you look up.
    Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.