PHP
BC 수학 (이진 계산기)
수색…
소개
이진 계산기를 사용하여 최대 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
보다 큰 정수를 원시적으로 저장할 수 없지만 0x0000000080000000
과 0x7FFFFFFFFFFFFFFF
사이의 정수는 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