현재 위치: > 최신 기사 목록> PHP 팩 함수에서 "F"와 "D"의 차이점은 무엇입니까? 플로팅 포인트 정확도 트랩을 밟은 적이 있습니까?

PHP 팩 함수에서 "F"와 "D"의 차이점은 무엇입니까? 플로팅 포인트 정확도 트랩을 밟은 적이 있습니까?

M66 2025-06-23

PHP에서 함수는 매우 실용적인 도구이며, 지정된 형식의 이진 문자열로 데이터를 패키지하는 데 사용되며 종종 네트워크 전송, 파일 스토리지 및 기타 시나리오에 사용됩니다. 특히 부동 소수점 번호와 관련하여 Pack은 두 가지 형식 코드를 제공합니다. "F""D" 는 비슷하지만 실제로는 필수적인 차이가 있습니다. 오늘 우리는 당신이 밟은 두 가지와 부동 소수점 정확도 트랩의 차이점을 탐구 할 것입니다.

팩 기능에 대한 간단한 검토

기능의 기본 사용은 다음과 같습니다.

 pack(string $format, mixed ...$values): string

형식 문자열에 기초하여 후속 매개 변수를 이진 데이터로 변환합니다.

그중에서도 일반적인 부동 소수점 형식 코드는 다음과 같습니다.

  • "F" : 단일--정밀 부동 소수점 번호 (플로트, 4 바이트)

  • "D" : 이중 정밀 플로팅 포인트 번호 (이중, 8 바이트)

"F"와 "D"의 차이

1. 다른 데이터 크기

  • "F"는 4 바이트 단일 정밀 부동물 플로팅 포인트 번호 , 즉 플로트 유형에 해당하며 IEEE 754 표준의 32 비트 부동 소수점 번호 형식을 따릅니다.

  • "D"는 8 바이트의 이중 프레이션 플로팅 포인트 숫자 , 즉 이중 유형에 해당하며 IEEE 754 표준의 64 비트 부동 소수점 번호 형식을 따릅니다.

이는 "D"가 더 큰 범위와 더 높은 정밀도의 부동 소수점 수를 나타내는 반면, "F"는 저장 공간에서는 더 작지만 정확도는 제한적임을 의미합니다.

2. 정확도와 수치 범위의 차이

  • 단일 정제 부동물 지점 번호 ( "F" )의 정확도는 약 7 자리 숫자입니다.

  • 이중 정밀 부동 소수점 번호 ( "D" )의 정확도는 약 15-16 숫자입니다.

매우 정확한 플로팅 포인트 데이터가 필요한 경우 "D"를 사용하는 것이 좋습니다.

3. 호환성 및 플랫폼 관련성

의 부동 소수점 번호 형식은 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 공식 매뉴얼의 패키지 기능 설명 주소 :