이 파일이 있고 첫 번째 열의 모든 숫자를 합산하고 싶습니다. 쉬운:
awk '{s+=$1;print $1,s}' file
0.1048 -1.2705
0.4196 -0.8509
0.4196 -0.4313
0.2719 -0.1594
0.0797 -0.0797
0.0797 -5.55112e-17 #Notice this line
당신은 마지막은 0 내가 그 알고 있어야 참조 e-17
제로이지만 출력의 범위에 0이 아니면 가끔 출력이 정확히 0입니다 e-15
에 e-17
부정적 또는 긍정적 인 신호에. 이 문제를 해결하려면 절대 값을 사용해야합니다.
awk '{s+=$1;if (sqrt(s^2)<0.01) s=0;print $1,s}' file
왜 이런 일이 일어나는지 아십니까?
귀하의 질문은 "왜 이런 일이 발생합니까?"이지만 다른 사람들이 언급 한 암시 적 질문은 "어떻게이 문제를 해결할 수 있습니까?"입니다. 의견에서 제기 한 접근 방식을 알아 냈습니다.
그래서 점을 없애기 위해 1000을 곱하면 정확한 결과를 얻을 수 있습니다.
예. 음, 10000, 소수점 네 자리가 있기 때문입니다. 이걸 고려하세요:
awk '{ s+=$1*10000; print $1, s/10000 }'
불행히도, 토큰 (문자열)을 십진수로 해석하자마자 손상이 이미 발생했기 때문에 이것은 작동하지 않습니다. 예를 들어 printf "%.20f\n"
는 입력 데이터 0.4157
가 실제로 0.41570000000000001394로 해석 된다는 것을 보여줍니다 . 이 경우 10000을 곱하면 4157이됩니다. 그러나 예를 들어 0.5973
= 0.59730000000000005311이고 여기에 10000을 곱하면 5973.00000000000090949470이됩니다.
그래서 대신 우리는
awk '{ s+=int($1*10000); print $1, s/10000 }'
"이어야하는"정수 (예 : 5973.00000000000090949470)를 해당 정수 (5973)로 변환합니다. 그러나 때로는 변환 오류가 음수이기 때문에 실패합니다. 예 : 0.7130
0.71299999999999996714입니다. 그리고 awk
의 함수는 반올림이 아니라 (0으로) 잘립니다 . 따라서 7129도 마찬가지 입니다.int(expr)
int(7129.99999999)
그래서 인생이 당신에게 레몬을 주면 당신은 레모네이드를 만듭니다. 도구가 자르기 기능을 제공하면 0.5를 더하여 반올림합니다. 7129.99999999 + 0.5≈7130.49999999, 물론 int(7130.49999999)
7130입니다. 그러나 기억하십시오 : 0쪽으로int()
잘리고 입력에 음수가 포함됩니다. –7129.99999999에서 –7130으로 반올림하려면 0.5를 빼서 –7130.49999999를 구해야합니다. 그래서,
awk '{ s+=int($1*10000+($1>0?0.5:-0.5)); print $1, s/10000 }'
$1*10000
if $1
is ≤ 0에 -0.5를 더합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다