PHP에서 팩 함수는 매우 실용적인 도구이며, 지정된 형식의 이진 문자열로 데이터를 패키지하는 데 사용되며 종종 네트워크 전송, 파일 스토리지 및 기타 시나리오에 사용됩니다. 특히 부동 소수점 번호와 관련하여 Pack은 두 가지 형식 코드를 제공합니다. "F" 와 "D" 는 비슷하지만 실제로는 필수적인 차이가 있습니다. 오늘 우리는 당신이 밟은 두 가지와 부동 소수점 정확도 트랩의 차이점을 탐구 할 것입니다.
팩 기능의 기본 사용은 다음과 같습니다.
pack(string $format, mixed ...$values): string
형식 문자열에 기초하여 후속 매개 변수를 이진 데이터로 변환합니다.
그중에서도 일반적인 부동 소수점 형식 코드는 다음과 같습니다.
"F" : 단일--정밀 부동 소수점 번호 (플로트, 4 바이트)
"D" : 이중 정밀 플로팅 포인트 번호 (이중, 8 바이트)
"F"는 4 바이트 단일 정밀 부동물 플로팅 포인트 번호 , 즉 플로트 유형에 해당하며 IEEE 754 표준의 32 비트 부동 소수점 번호 형식을 따릅니다.
"D"는 8 바이트의 이중 프레이션 플로팅 포인트 숫자 , 즉 이중 유형에 해당하며 IEEE 754 표준의 64 비트 부동 소수점 번호 형식을 따릅니다.
이는 "D"가 더 큰 범위와 더 높은 정밀도의 부동 소수점 수를 나타내는 반면, "F"는 저장 공간에서는 더 작지만 정확도는 제한적임을 의미합니다.
단일 정제 부동물 지점 번호 ( "F" )의 정확도는 약 7 자리 숫자입니다.
이중 정밀 부동 소수점 번호 ( "D" )의 정확도는 약 15-16 숫자입니다.
매우 정확한 플로팅 포인트 데이터가 필요한 경우 "D"를 사용하는 것이 좋습니다.
팩 의 부동 소수점 번호 형식은 Machine Endianness (Large-End) 순서의 영향을받습니다. 시스템은 일반적으로 소규모 목도를 사용하지만 플랫폼을 전송할 때는 특별한주의를 기울여야합니다.
<?php
$value = 0.1 + 0.2;
$packed_f = pack("f", $value);
$packed_d = pack("d", $value);
echo "원래 가치:$value\n";
echo "단일 정밀 포장 후 16 진수:".bin2hex($packed_f)."\n";
echo "이중 정밀 포장 후 16 진수:".bin2hex($packed_d)."\n";
출력 예 :
원래 가치:0.3
단일 정밀 포장 후 16 진수:9a99993e
이중 정밀 포장 후 16 진수:9a9999999999b93f
입력은 0.3 이지만 단일 및 이중 정밀의 이진 표현은 다르다는 것을 알 수 있습니다. 부동 소수점 숫자 자체는 특정 소수점 소수성을 완전히 나타낼 수 없으며 단일 정밀의 오류가 훨씬 더 크기 때문입니다.
고정밀 부동산 지점 번호를 저장하거나 전송 해야하는 경우 "D"가 선호됩니다.
공간 절약 및 정확도 요구 사항이 높지 않은 경우 "F"를 사용하십시오.
네트워크 프로토콜 또는 파일 형식을 다룰 때는 오해를 피하기 위해 프로토콜에 필요한 부동 소수점 형식을 명확하게합니다.
크로스 플랫폼 응용 프로그램의 경우 Endianness 문제를 고려하는 것이 좋습니다. 팩 과 포장을 사용할 때는 엔디 니스를 통합해야합니다.
PHP 공식 매뉴얼의 패키지 기능 설명 주소 :