IEEE 754에서 문자열 간 부동 소수점 잘림을 처리하는 올바른 방법은 무엇입니까? [닫은]


3

소프트웨어 엔지니어가 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의 거듭 제곱없이 숫자와 소수를 한 번만 읽으면됩니다. 이것이 선호되는 방법이라면 위키 항목을 업데이트해야합니다.


1
이 질문은 엔지니어링과 관련이 없으며 스택 오버플로 또는 소프트웨어 엔지니어링에 훨씬 적합합니다 .
와사비

2
IEEE 754 질문이므로 소프트웨어 엔지니어링 질문이 아니며 내가 요청한 소프트웨어 엔지니어가 알지 못합니다. 이것은 유효하지 않은 비트 패턴의 기술에 관한 것이므로 하드웨어, 펌웨어 및 소프트웨어 모두에 적용되는 컴퓨터 엔지니어링 질문입니다.

그것이 IEEE 754 질문으로 여겨졌다면, 질문에서 그 말을했을 것입니다. 모든 컴퓨터가 부동 소수점에 IEEE를 사용하는 것은 아닙니다!
alephzero

1
주제를 벗어난 것 외에도 두 번째 단락에서 OP 는 알고리즘이 무엇을 해야하는지 실제로 알지 못하는 것 같습니다 . 사양이 무엇인지 추측하는 것은 우리의 일이 아닙니다! 포스트의 후반부 의견은 OP가 "0.1"과 같은 문자열조차도 모든 길이의 데이터에 대해 이진 부동 소수점으로 정확하게 표현 되지 않는다는 것을 인식하지 못한다고 제안 할 수 있습니다 .
alephzero

@Cale-SE.SE 또는 주제에 관한 다른 곳 에서이 답변에 기꺼이 대답 하고 있으며 둘 다 계정이 있습니다.
Rob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.