2012-01-28 6 views
6

나는, libquadmath를 사용하여 __float128을 printf를하기 위해 노력하고있어 예 : 다음과 같은 세 가지 constaints와정보를 잃지 않기 위해 __float128에 필요한 printf 정밀도는 무엇입니까?

quadmath_snprintf(s, sizeof(s), "%.30Qg", f); 

:

  1. 출력은 다음과 생산 일치해야합니다

    number = [ minus ] int [ frac ] [ exp ] 
    
    decimal-point = %x2E  ; . 
    
    digit1-9 = %x31-39   ; 1-9 
    
    e = %x65/%x45   ; e E 
    
    exp = e [ minus/plus ] 1*DIGIT 
    
    frac = decimal-point 1*DIGIT 
    
    int = zero/(digit1-9 *DIGIT) 
    
    minus = %x2D    ; - 
    
    plus = %x2B    ; + 
    
    zero = %x30    ; 0 
    
  2. 위의 프로덕션 "s"와 일치하는 문자열에 printfed 된 모든 입력 __float128 "i"를 제공 한 다음 "s"를 __floa로 다시 scanfed합니다 t128 "j"- "i"는 "j"와 비트 동일해야합니다. 즉, 정보를 잃어 버리지 않아야합니다. 적어도 일부 값에 대해서는 이것이 가능하지 않습니다 (NaN, Infinity). 그 값의 전체 목록은 무엇입니까?

  3. 위의 두 가지 기준을 충족하는 다른 문자열이 후보보다 짧아야합니다.

위의 (가능한 경우 1, 3 및 2)를 만족하는 quadmath_snprintf 형식 문자열이 있습니까? 그렇다면 무엇입니까?

위의 제작 과정에서 포인트 2를 만족시킬 정도로 정확하게 표현할 수없는 __float128의 값은 무엇입니까? (예 : Nan, +/- Infinity 등) __float128이이 값 중 하나를 보유하고 있는지 어떻게 알 수 있습니까?

+0

__float128에서 정확하게 표현할 수없는 무한한 10 진수 집합이 있습니다. 34 자리 이상의 유효 자릿수 형식 지정자는 임의의 절대 숫자> = 1E5에 대해 임의의 숫자를 생성합니다. 당신의 접근 방식은 깊이 결점이 있으며 아마도 문제를 해결하기 위해 __float128이 필요하다고 생각함으로써 시작할 수 있습니다. –

+5

__float128에서 정확하게 표현할 수없는 무한 수의 십진수가 있다는 사실은 중요하지 않습니다. 요점 2는 십진수 표현이 정확하고 읽기만하고 반올림 한 내용이 정확하다는 것을 요구합니다. 형식 지정자가 올바르지 않다고 인식하면 올바른 질문을 묻습니다. 내 "접근법"은 괜찮 았고 어떤 문제를 해결하려고하는지 전혀 알지 못합니다. –

답변

1

x86을 사용하는 경우 GCC __float128 유형은 IEEE 754-2008 binary128 형식의 소프트웨어 구현입니다. IEEE 754 표준은 문자 표현에 36 개의 유효 (10 진수) 숫자가 포함되어 있으면 2 진 -> char -> 2 진 왕복으로 원래 값을 복구해야합니다. 따라서 형식 문자열 "% .36Qg"가이를 수행해야합니다.

NaN 왕복이 원래 비트 값을 복구 할 필요는 없습니다.

귀하의 요구 사항 # 3에서 libquadmath는 이러한 종류의 "최단 표현"형식을위한 코드를 포함하지 않습니다. Steele의 정신으로 & 백서 또는 David Gay의 코드.

0

내 직감은 이진수 0.1111 ... 1 (128 ones)이라고 알려줍니다. 또한 1-1/2 ** 128과 동일하면 십진수로 변환 할 때 오버플로 수가 가장 많습니다. 그 값을 10 진수로 변환하면 (지금 당장 패키지가 없기 때문에), 숫자의 수를 세고 그 위에 2-3을 더하면 안전해야합니다. 하지만 수학적인 증거로는 충분하지 않습니다.

I/O의 정밀도가 중요하면 float을 16 진수 문자열로 출력하는 것이 좋습니다. 정확한 부동 소수점 IO는 제대로 작동하기 어렵고, 라이브러리는 그 점에서 버그가있을 수 있습니다.

+0

"0.1111 ...1 (128 ones) "은'__float128'로 표현할 수 없지만 128을 113로 수정했을 때 왜이 숫자가 최악의 경우인지는 알 수 없습니다. 최악의 경우 후보의 십진수 표현은 9를 선도하는 대신 1을 선두로 사용합니다. –