수색…


소개

이진 계산기를 사용하여 최대 2147483647-1 개의 소수점 이하 자릿수를 문자열 형식으로 계산할 수 있습니다. 이진 계산기는 PHP의 부동 계산보다 정확합니다.

통사론

  • 문자열 bcadd (문자열 $ left_operand, 문자열 $ right_operand [, int $ scale = 0])
  • int bccomp (문자열 $ left_operand, 문자열 $ right_operand [, int $ scale = 0])
  • 문자열 bcdiv (문자열 $ left_operand, 문자열 $ right_operand [, int $ scale = 0])
  • 문자열 bcmod (문자열 $ left_operand, 문자열 $ 모듈러스)
  • 문자열 bcmul (문자열 $ left_operand, 문자열 $ right_operand [, int $ scale = 0])
  • 문자열 bcpowmod (string $ left_operand, 문자열 $ right_operand, 문자열 $ 모듈러스 [, int $ scale = 0])
  • bool bcscale (int $ scale)
  • 문자열 bcsqrt (string $ operand [, int $ scale = 0])
  • 문자열 bcsub (문자열 $ left_operand, 문자열 $ right_operand [, int $ scale = 0])

매개 변수

bcadd 임의의 두 정밀도 숫자를 추가하십시오.
left_operand 왼쪽 피연산자입니다 (문자열).
right_operand 문자열로서의 오른쪽 피연산자.
scale 결과의 소수점 이하 자릿수를 설정하는 선택적 매개 변수입니다.
bccomp 2 개의 임의의 정밀도를 비교합니다.
left_operand 왼쪽 피연산자입니다 (문자열).
right_operand 문자열로서의 오른쪽 피연산자.
scale 비교에 사용할 소수점 이하 자릿수를 설정하는 선택적 매개 변수입니다.
bcdiv 2 개의 임의의 정밀도 수를 나눕니다.
left_operand 왼쪽 피연산자입니다 (문자열).
right_operand 문자열로서의 오른쪽 피연산자.
scale 결과의 소수점 이하 자릿수를 설정하는 선택적 매개 변수입니다.
bcmod 임의의 정밀도의 모듈러를 얻는다.
left_operand 왼쪽 피연산자입니다 (문자열).
modulus 모듈러스 (문자열).
bcmul 임의의 두 정밀도 수를 곱하십시오.
left_operand 왼쪽 피연산자입니다 (문자열).
right_operand 문자열로서의 오른쪽 피연산자.
scale 결과의 소수점 이하 자릿수를 설정하는 선택적 매개 변수입니다.
bcpow 임의의 정밀도 수를 다른 수로 올립니다.
left_operand 왼쪽 피연산자입니다 (문자열).
right_operand 문자열로서의 오른쪽 피연산자.
scale 결과의 소수점 이하 자릿수를 설정하는 선택적 매개 변수입니다.
bcpowmod 임의의 정밀도 수를 다른 수로 올리거나 지정된 모듈로 나눕니다.
left_operand 왼쪽 피연산자입니다 (문자열).
right_operand 문자열로서의 오른쪽 피연산자.
modulus 모듈러스 (문자열).
scale 결과의 소수점 이하 자릿수를 설정하는 선택적 매개 변수입니다.
Bcscale 모든 bc 수학 함수에 기본 스케일 매개 변수를 설정하십시오.
scale 축척 비율
bcsqrt 임의의 정밀도의 제곱근을 가져옵니다.
operand 피연산자입니다 (문자열).
scale 결과의 소수점 이하 자릿수를 설정하는 선택적 매개 변수입니다.
bcsub 하나의 임의의 정밀도 수를 다른 정밀도 수에서 뺍니다.
left_operand 왼쪽 피연산자입니다 (문자열).
right_operand 문자열로서의 오른쪽 피연산자.
scale 결과의 소수점 이하 자릿수를 설정하는 선택적 매개 변수입니다.

비고

모든 BC 함수의 경우 scale 매개 변수가 설정되지 않은 경우 기본값은 0이며 모든 작업이 정수 연산이됩니다.

BCMath와 부동 산술 연산의 비교

bcadd 대 float + float

var_dump('10' + '-9.99');           // float(0.0099999999999998)
var_dump(10 + -9.99);               // float(0.0099999999999998)
var_dump(10.00 + -9.99);            // float(0.0099999999999998)
var_dump(bcadd('10', '-9.99', 20)); // string(22) "0.01000000000000000000"

bcsub 대 float-float

var_dump('10' - '9.99');           // float(0.0099999999999998)
var_dump(10 - 9.99);               // float(0.0099999999999998)
var_dump(10.00 - 9.99);            // float(0.0099999999999998)
var_dump(bcsub('10', '9.99', 20)); // string(22) "0.01000000000000000000"

bcmul 대 int * int

var_dump('5.00' * '2.00');            // float(10)
var_dump(5.00 * 2.00);                // float(10)
var_dump(bcmul('5.0', '2', 20));      // string(4) "10.0"
var_dump(bcmul('5.000', '2.00', 20)); // string(8) "10.00000"
var_dump(bcmul('5', '2', 20));        // string(2) "10"

bcmul 대 float * float

var_dump('1.6767676767' * '1.6767676767');           // float(2.8115498416259)
var_dump(1.6767676767 * 1.6767676767);               // float(2.8115498416259)
var_dump(bcmul('1.6767676767', '1.6767676767', 20)); // string(22) "2.81154984162591572289"

bcdiv 대 float / float

var_dump('10' / '3.01');           // float(3.3222591362126)
var_dump(10 / 3.01);               // float(3.3222591362126)
var_dump(10.00 / 3.01);            // float(3.3222591362126)
var_dump(bcdiv('10', '3.01', 20)); // string(22) "3.32225913621262458471"

bcmath를 사용하여 32 비트 시스템에서 이진수 읽기 / 쓰기

32 비트 시스템에서는 0x7FFFFFFF 보다 큰 정수를 원시적으로 저장할 수 없지만 0x00000000800000000x7FFFFFFFFFFFFFFF 사이의 정수는 64 비트 시스템에서는 원시적으로 저장할 수 있지만 32 비트 시스템에서는 ( signed long long 없는) 저장할 수 없습니다. 그러나 64 비트 시스템과 다른 많은 언어가 signed long long 정수 저장을 지원하기 때문에 때때로이 정수 범위를 정확한 값으로 저장해야합니다. 두 가지 숫자로 배열을 만들거나 정수를 사람이 읽을 수있는 십진법으로 변환하는 등 여러 가지 방법이 있습니다. 이것은 사용자에게 제공하는 편리함과 bcmath로 직접 조작 할 수있는 것과 같은 몇 가지 장점이 있습니다.

pack / unpack 메소드는 2 진수 바이트와 10 진수 형식의 숫자 (둘 다 유형 string 이지만 하나는 2 진수이고 하나는 ASCII 임) 사이를 변환하는 데 사용할 수 있지만 항상 ASCII 문자열을 32 비트로 변환하려고 시도합니다 32 비트 시스템에서는 int입니다. 다음 스 니펫은 대안을 제공합니다.

/** Use pack("J") or pack("p") for 64-bit systems */
function writeLong(string $ascii) : string {
    if(bccomp($ascii, "0") === -1) { // if $ascii < 0
        // 18446744073709551616 is equal to (1 << 64)
        // remember to add the quotes, or the number will be parsed as a float literal
        $ascii = bcadd($ascii, "18446744073709551616");
    }

    // "n" is big-endian 16-bit unsigned short. Use "v" for small-endian.
    return pack("n", bcmod(bcdiv($ascii, "281474976710656"), "65536")) .
        pack("n", bcmod(bcdiv($ascii, "4294967296"), "65536")) .
        pack("n", bcdiv($ascii, "65536"), "65536")) .
        pack("n", bcmod($ascii, "65536"));
}

function readLong(string $binary) : string {
    $result = "0";
    $result = bcadd($result, unpack("n", substr($binary, 0, 2)));
    $result = bcmul($result, "65536");
    $result = bcadd($result, unpack("n", substr($binary, 2, 2)));
    $result = bcmul($result, "65536");
    $result = bcadd($result, unpack("n", substr($binary, 4, 2)));
    $result = bcmul($result, "65536");
    $result = bcadd($result, unpack("n", substr($binary, 6, 2)));

    // if $binary is a signed long long
    // 9223372036854775808 is equal to (1 << 63) (note that this expression actually does not work even on 64-bit systems)
    if(bccomp($result, "9223372036854775808") !== -1) { // if $result >= 9223372036854775807
        $result = bcsub($result, "18446744073709551616"); // $result -= (1 << 64)
    }
    return $result;
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow