%e 예상치 못한 awk OFMT 동작

%e 예상치 못한 awk OFMT 동작

누구든지 나를 도울 수 있는지 궁금합니다. 어쩌면 소스 코드에 뭔가 숨어 있을 수도 있습니다. 불행히도 저는 이 문제의 원인을 파악하기 위해 C에 대해 충분히 알지 못합니다.

이 동작을 설명하기 위해 다음 awk 스크립트를 테스트 도구로 실행했습니다.

#! /usr/bin/env -S awk -E

BEGIN {
  OFMT = "%2.3e"
  CONVFMT = "%2.3e"

  print "gawk version:", PROCINFO["version"]

}

{
  for (f=1; f<=NF; f++) {
    print ""
    print "No modification:", typeof($f), $f
    print "Casting strnum to number via OFMT (" OFMT ") with 0+$" f ":",
      typeof(0+$f), 0+$f
    print "Casting strnum to string via CONVFMT (" CONVFMT ") with \"\" 0+$" f ":",
      typeof("" 0+$f), "" 0+$f
    print "Using strtonum():", strtonum($f)
    printf "Explicitly formatting as %%2.3e using printf: %2.3e\n", $f
  }
    print ""

  # "Born" a number (i.e., no conversion from strnum)
  x = 32553225
  print typeof(x), x
  # Now give it a fractional part
  x += 0.1
  print typeof(x), x
}
$ ./ofmt_test.awk <<< '236437734634 236437734634.000 236437734634.001'
gawk version: 4.2.1

No modification: strnum 236437734634
Casting strnum to number via OFMT (%2.3e) with 0+$1: number 236437734634
Casting strnum to string via CONVFMT (%2.3e) with "" 0+$1: string 236437734634
Using strtonum(): 236437734634
Explicitly formatting as %2.3e using printf: 2.364e+11

No modification: strnum 236437734634.000
Casting strnum to number via OFMT (%2.3e) with 0+$2: number 236437734634
Casting strnum to string via CONVFMT (%2.3e) with "" 0+$2: string 236437734634
Using strtonum(): 236437734634
Explicitly formatting as %2.3e using printf: 2.364e+11

No modification: strnum 236437734634.001
Casting strnum to number via OFMT (%2.3e) with 0+$3: number 2.364e+11
Casting strnum to string via CONVFMT (%2.3e) with "" 0+$3: string 2.364e+11
Using strtonum(): 2.364e+11
Explicitly formatting as %2.3e using printf: 2.364e+11

number 32553225
number 3.255e+07

따라서 OFMT첫 번째 큰 숫자( 236437734634)에는 영향이 없지만 printf 문에서 명시적인 변환을 수행하는 것이 가능할 것 같습니다. 그래서 .000효과가 없는 소수 부분을 추가했습니다 . 그런 다음 반대 방향으로 변경했는데 지금은 .001이전에 작동하지 않았던 모든 것이 OFMT작동합니까?

strnum원인 으로 형변환을 배제하기 위해 끝에 "독립형" 테스트 사례를 추가했습니다 . 그러나 동일한 효과가 발생합니다.

여기에는 소수점 뒤의 0이 아닌 소수 부분이 필요 OFMT하지만 명시적인 형식 변환에는 필요하지 않습니다 %e.

답변1

나는 이것을 CONVFMT대략 보았다.POSIX 확장 설명:

정수 값과 정확히 동일한 숫자 값(참조: ISO C 표준에서 파생된 개념)는 호출과 동일하게 문자열로 변환되어야 합니다.스프린트 기능기능(참조 문자열 함수) 문자열을 "%d"다음과 같이 사용FMMT매개변수 합계는 첫 번째이자 유일한 숫자 값으로 변환됩니다.표현 토론. 다른 숫자 값은 호출과 동일하게 문자열로 변환되어야 합니다.스프린트 기능함수 및 변수 값컨벌루션 FMT~처럼FMMT매개변수 합계는 첫 번째이자 유일한 숫자 값으로 변환됩니다.표현토론.

이는 여기와 관련 섹션에서 볼 수 있는 내용을 거의 설명합니다.출력문:

모든 표현식 인수는 문자열로 처리되어야 하며 필요한 경우 변환되어야 합니다.awk의 표현, 예외는인쇄 기능형식은직교 주파수 도메인 변조 값 대신 사용해야 합니다.컨벌루션 FMT.

그래서 우리는 그것을 가지고 있습니다.

관련 정보