소프트웨어 엔지니어가 IEEE 754 질문에 대답 할 수있는 적절한 수학 기술이 없으므로 IEEE 교사가 답변해야하기 때문에 이것은 StackOverflow 질문이 아닙니다.
C ++ 템플릿을 사용하여 Grisu 및 Unicode에 대해 고유 한 문자열 대 부동 및 부동 대 문자열 알고리즘을 구현해야했습니다 . Wikipedia 단 정밀도 부동 소수점 형식 기사 에서 찾은 다음 알고리즘을 사용했습니다 .
- 정수와 분수 부분 (예 : 12.375)을 가진 실수를 고려하십시오.
- 정수 부분을 이진수로 변환하고 정규화하십시오.
- 여기에 표시된 다음 기술을 사용하여 분수 부분을 변환
- 두 개의 결과를 추가하고 적절한 최종 변환을 생성하도록 조정
float로 변환되는 문자열이 더 많은 자릿수 정밀도를 가질 때 수행해야 할 작업이 확실하지 않은 경우 32 비트 (예 : float)에 저장할 수 있지만 +/- 무한대에 도달하지 않으며 부정확 한 숫자를 반올림하는 올바른 방법 / 소수점. 32 비트 부동 소수점 숫자의 경우 정밀도는 7 자리입니다. 64 비트 부동 소수점 숫자의 경우 16 자리 정밀도입니다. IEEE 754 반올림 규칙을 사용하여 반올림해야합니다 .
예
베이스 2 옵션
우리는 위키 항목 의 알고리즘처럼 정수 부분을 먼저 변환하여 최하위 숫자로 스캔 한 다음 각 숫자에 10의 거듭 제곱 (즉, 표준 문자열-정수 알고리즘)을 곱하여 최상위 숫자로 다시 구문 분석합니다. 부호없는 곱셈 랩 어라운드를 사용하여 비트 2를 반올림하여 비트 오버플로를 감지하십시오. 그것은 나에게 잘 들리지 않으며 Wikipedia 기사가 최고의 알고리즘이 아니라고 생각합니다.
기본 10 옵션
우리는 123456780123456789.012 변환과 같이 최상위 숫자를 사용하여 모든 숫자를 지수 표기법으로 변환합니다. IEEE 754 반올림 규칙을 사용하여 1.234567e20 . 우리는 텍스트를 한 번만 구문 분석하고 지수를 스캔해야하기 때문에 문자열 대 정수 알고리즘을 피할 수 있기 때문에 최상의 선택처럼 들립니다. 10 진법은 여전히 10 진법에있는 숫자로 인해 가장 소리가 나지 않으며 10의 거듭 제곱없이 숫자와 소수를 한 번만 읽으면됩니다. 이것이 선호되는 방법이라면 위키 항목을 업데이트해야합니다.