누구든지 나를 도울 수 있는지 궁금합니다. 어쩌면 소스 코드에 뭔가 숨어 있을 수도 있습니다. 불행히도 저는 이 문제의 원인을 파악하기 위해 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.
그래서 우리는 그것을 가지고 있습니다.